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 varsayılan veya analiz et 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 birleşik 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 işlem, sorgu yürütme çalışma zamanındaki istatistiklerle birlikte daha önce bahsedilen 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.
Sorgu Açıklama özelliğinin 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 normal ücret alınır.
Varsayılan seçenekle Query Explain'i kullanma
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.
Sorgu Açıkla'yı analiz seçeneğiyle 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", } } }
Sorgunun yürütülmesinin performansını optimize etmek için tamamen kapsayıcı bir karma 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", } } }