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

Sorgu Açıklaması, arka uca Cloud Firestore sorguları göndermenize ve karşılığında arka uç sorgu yürütmeyle ilgili ayrıntılı performans istatistikleri almanıza olanak tanır. Birçok ilişkisel veritabanı sisteminde EXPLAIN [ANALYZE] işlemi gibi çalışır.

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

Sorgu Açıklaması sonuçları, sorgularınızın nasıl yürütüldüğünü anlamanıza yardımcı olur. Bu sonuçlarda, verimsizlikler ve sunucu tarafında olası darboğazların konumu gösterilir.

Sorgu Açıklaması:

  • Sorgu dizine eklemelerinizi ayarlayabilmeniz ve verimliliği artırabilmeniz için sorgu planlama aşamasıyla ilgili analizler sağlar.
  • 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 et

Sorgu Açıklama işlemleri, default (varsayılan) veya analiz (analiz) seçeneği kullanılarak gerçekleştirilebilir.

Varsayılan seçenekte, Sorgu Açıkla özelliği sorguyu planlar ancak yürütme aşamasını atlar. Bu işlem, planlayıcı aşama bilgilerini döndürür. Bir sorgunun gerekli dizinlere sahip olup olmadığını kontrol etmek ve hangi dizinlerin kullanıldığını anlamak için bunu kullanabilirsiniz. Bu sayede, örneğin belirli bir sorgunun birçok farklı dizinle kesişmek yerine karma bir dizin kullandığını doğrulayabilirsiniz.

Sorgu Açıkla, analiz seçeneğiyle hem planları açıklar hem de sorguyu yürütür. Bu, sorgu yürütme çalışma zamanındaki istatistiklerle birlikte daha önce belirtilen tüm planlayıcı bilgilerini döndürür. Bu raporda, sorgu yürütmeyle ilgili sistem düzeyinde analizlerin yanı sıra sorgunun fatura bilgileri de yer alır. Bu araçları kullanarak çeşitli sorgu ve dizin yapılandırmalarını test edebilir, maliyetlerini ve gecikmelerini optimize edebilirsiniz.

Query Explain'in maliyeti nedir?

Sorgu Açıkla'yı varsayılan seçenekle kullandığınızda dizin veya okuma işlemi yapılmaz. Sorgunun karmaşıklığından bağımsız olarak bir okuma işlemi ücretlendirilir.

Sorgu Açıkla'yı analiz seçeneğiyle kullandığınızda dizin ve okuma işlemleri gerçekleştirilir. Bu nedenle, sorgu için her zamanki gibi ücretlendirilirsiniz. Analiz etkinliği için ek ücret alınmaz. Yalnızca yürütülen sorgu için alınan normal ücret alınır.

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.

İsteklere, normal sorgu işlemleri için kullanılan izinlerle IAM ile kimlik doğrulaması yapıldığını unutmayın. Firebase Authentication gibi diğer kimlik doğrulama teknikleri yoksayılır. Daha fazla bilgi için Sunucu istemci kitaplıkları için IAM başlıklı kılavuzu inceleyin.

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ı raporu referansı başlıklı makaleyi inceleyin.

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

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

İsteklere, normal sorgu işlemleri için kullanılan izinlerle IAM ile kimlik doğrulaması yapıldığını unutmayın. Firebase Authentication gibi diğer kimlik doğrulama teknikleri yoksayılır. Daha fazla bilgi için Sunucu istemci kitaplıkları için IAM başlıklı kılavuzu inceleyin.

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'a 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. Ö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ı raporu referansı başlıklı makaleyi inceleyin.

Sonuçları yorumlama ve düzenlemeler yapma

Filmleri türe ve prodüksiyon ülkesine göre sorguladığımız örnek bir senaryoya bakalım.

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, sorgunun (category ASC, __name__ ASC) ve (country ASC, __name__ ASC) adlı iki tek alan dizininde çalıştığını gösterir. 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 tamamı kapsanan bir birleşik dizin (category ASC, country ASC, __name__ ASC) oluşturabilirsiniz.

Sorguyu analiz seçeneğiyle tekrar çalıştırdığımızda, bu sorgu için yeni oluşturulan dizinin seçildiğini ve sorgunun çok daha hızlı ve verimli çalıştığını görebiliriz.

// 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",
               }
    }
}