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

Query Explain, Cloud Firestore sorgularını arka uca göndermenize ve karşılığında arka uç sorgu yürütmesiyle 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 Explain istekleri, Firestore sunucusu istemci kitaplıkları kullanılarak gönderilebilir.

Sorgu Açıklamalı sonuçlar, sorgularınızın nasıl yürütüldüğünü anlamanıza yardımcı olarak verimsizlikleri ve olası sunucu tarafı performans sorunlarının konumunu gösterir.

Sorgu Açıklaması:

  • Sorgu dizinlerinizi ayarlayabilmeniz ve verimliliği artırabilmeniz için sorgu planlama aşamasında analizler sunar.
  • Analiz seçeneğini kullanmak, sorgu başına maliyet ve performansınızı anlamanıza yardımcı olur ve kullanımını optimize etmek için farklı sorgu kalıplarında hızlıca iterasyon yapmanızı sağlar.

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

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

Varsayılan seçenek kullanıldığında Query Explain, 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 zorunda kalmadan birleşik bir dizin kullandığını doğrulayabilirsiniz.

Analiz seçeneği kullanıldığında, Query Explain hem planları 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. Buna, sorgu yürütmeyle ilgili sistem düzeyindeki bilgilerin yanı sıra sorgunun fatura bilgileri de dahildir. Bu aracı, maliyetlerini ve gecikmelerini optimize etmek amacıyla çeşitli sorgu ve dizin yapılandırmalarını test etmek için kullanabilirsiniz.

Query Explain'in maliyeti nedir?

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

Query Explain'i analiz seçeneğiyle birlikte kullandığınızda dizine ekleme ve okuma işlemleri gerçekleştirilir. Böylece 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.

İsteklerin, normal sorgu işlemleri için aynı izinler kullanılarak IAM ile doğrulandığı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 ile ilgili 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. Örnek:

{
    "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, normal sorgu işlemleri için aynı izinler kullanılarak IAM ile doğrulandığı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 ile ilgili 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 öğ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. Ö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 üretim ülkesine göre sorguladığımız örnek bir senaryoya bakalım.

Örnek olarak, bu SQL sorgusunun eşdeğerini varsayın.

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) olmak üzere iki tek alanlı dizinde çalıştırıldığı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 daha verimli bir şekilde ç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",
               }
    }
}