Sorgu Açıklaması'nı kullanarak sorgu performansını anlama

Query Explain, Cloud Firestore sorgularını arka uç sorgu yürütme ve arka uç sorgu yürütmeyle ilgili ayrıntılı performans istatistiklerini alma karşılığında. Birçok dilde EXPLAIN [ANALYZE] işlemi gibi çalışır veritabanı sistemleri.

Sorgu açıklama istekleri, Firestore sunucu istemci kitaplıkları kullanılarak gönderilebilir.

Sorgu Açıklama sonuçları, sorgularınızın performansını anlamanıza yardımcı olur. çalıştırılarak, verimsizlikleri ve olası sunucu tarafının konumunu göz önünde bulundurmanız gerekir.

Sorgu Açıklaması:

  • Sorgunuzu ayarlayabilmeniz için sorgu planlama aşamasıyla ilgili analizler sağlar ve verimliliği artırır.
  • Analiz seçeneğini kullanmak, maliyetinizi ve performansınızı sorgu bazında anlamanıza yardımcı olur ve kullanımlarını optimize etmek için farklı sorgu kalıpları arasında hızlıca iterasyon yapmanıza olanak tanır.

Sorgu Açıklama seçeneklerini anlama: varsayılan ve analiz etme

Sorgu Açıklama işlemleri, default (varsayılan) seçeneği kullanılarak veya analiz seçeneğini de kullanabilirsiniz.

Varsayılan seçenek kullanıldığında "Query Explain", sorguyu planlar ancak atlar. destekleyici materyalleri inceleyeceksiniz. Bu işlem, planlayıcı aşama bilgilerini döndürür. Şunları yapabilirsiniz: bunu, bir sorgunun gerekli dizinlere sahip olup olmadığını kontrol etmek ve hangi dizinler kullanılır. Bu, örneğin belirli bir reklamverenin, web'deki belirli bir birçok farklı alanla kesişmek zorunda kalmadan bileşik bir dizin dizine ekler.

Sorgu, analiz seçeneği sayesinde hem planları hem de emin olun. Bu, daha önce bahsedilen tüm planlayıcı bilgilerini istatistiklerinden birini seçin. Bu, sorguya ait sistem düzeyindeki analizlerle birlikte sorgunun bilgilerini çok önemlidir. Bu aracı, çeşitli sorguları ve dizinleri test etmek için yapılandırmaları ve gecikmelerini optimize etmek için kullanır.

Query Explain'in maliyeti nedir?

Query Explain'i varsayılan seçenekle kullandığınızda dizine ekleme veya okuma işlemi yapılmaz. emin olun. Sorgunun karmaşıklığından bağımsız olarak bir okuma işlemi ücretlendirilir.

Query Explain'i analiz seçeneği, dizine ekleme ve okuma işlemleriyle birlikte kullandığınızda gerçekleştirilir, bu nedenle sorgu için her zamanki gibi ücretlendirilirsiniz. Ek ödeme aracı için alınan normal ücret, yalnızca analiz işlemi için alınan yürütüldü.

Varsayılan seçenekle "Sorgu Açıklaması"nı kullanın

Varsayılan seçenek isteği göndermek için istemci kitaplıklarını kullanabilirsiniz.

İsteklerin IAM ile doğrulandığında, aynı izin verdiğinden emin olun. Diğer kimlik doğrulama teknikleri: Firebase Authentication yok sayılır. Daha fazla bilgi için Sunucu istemci kitaplıkları için IAM.

Java (Yönetici)

Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();

    
Düğüm (Yönetici)

const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;

    

Yanıtın tam biçimi, yürütme ortamına bağlıdır. Döndürülen sonuçlar JSON'a dönüştürülebilir. Örneğin:

{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

Daha fazla bilgi için Sorgu Açıklaması rapor referansı bölümüne bakın.

Analiz seçeneğiyle Sorgu Açıklaması'nı kullanma

Analiz seçeneği isteği göndermek için istemci kitaplıklarını kullanabilirsiniz.

İsteklerin IAM ile doğrulandığında, aynı izin verdiğinden emin olun. Diğer kimlik doğrulama teknikleri: Firebase Authentication yok sayılır. Daha fazla bilgi için Sunucu istemci kitaplıkları için IAM.

Java (Yönetici)

Query q = db.collection("col").whereGreaterThan("a", 1);

ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();

ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();

    
Düğüm (Yönetici)

const q = db.collection('col').where('country', '=', 'USA');

const options = { analyze : 'true' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;

    

Aşağıdaki örnekte, planInfo öğesine ek olarak döndürülen stats nesnesi gösterilmektedir. Yanıtın tam biçimi, yürütme ortamına bağlıdır. İlgili içeriği oluşturmak için kullanılan örnek yanıt JSON biçimindedir.

{
    "resultsReturned": "5",
    "executionDuration": "0.100718s",
    "readOperations": "5",
    "debugStats": {
               "index_entries_scanned": "95000",
               "documents_scanned": "5"
               "billing_details": {
                     "documents_billable": "5",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }

}

Daha fazla bilgi için Sorgu Açıklaması rapor referansı bölümüne bakın.

Sonuçları yorumlama ve düzenlemeler yapma

Filmleri türe ve boyuta göre sorguladığımız üretildiği ülke.

Açıklama için bu SQL sorgusunun eşdeğerini varsayalım.

SELECT *
FROM /movies
WHERE category = 'Romantic' AND country = 'USA';

Analiz seçeneğini kullanırsak döndürülen metrikler, (category ASC, __name__ ASC) ve (country ASC, __name__ ASC). 16.500 dizin girişini tarar ancak yalnızca 1.200 belge döndürür.

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

// Output query status
{
    "resultsReturned": "1200",
    "executionDuration": "0.118882s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "16500",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}

Sorgu yürütme performansını optimize etmek için bir tam kapsamlı birleşik dizin (category ASC, country ASC, __name__ ASC).

Sorguyu analiz seçeneğiyle tekrar çalıştırdığımızda, Bu sorgu için yeni oluşturulan dizin seçilir ve sorgu çok daha hızlı çalışır ve daha verimli şekilde.

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, country ASC,  __name__ ASC)"}
    ]
}

// Output query stats
{
    "resultsReturned": "1200",
    "executionDuration": "0.026139s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "1200",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}