Sorgu Açıklama, arka uca Cloud Firestore sorgu göndermenize ve karşılığında arka uç sorgu yürütme ile 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çıklama sonuçları, sorgularınızın nasıl yürütüldüğünü anlamanıza yardımcı olur. Bu sonuçlarda verimsizlikler ve olası sunucu tarafı darboğazların konumu gösterilir.
Sorgu Açıklama:
- Sorgu planlama aşamasıyla ilgili analizler sunarak sorgu dizinlerinizi ayarlamanıza ve verimliliği artırmanıza olanak tanır.
- Analiz seçeneğini kullanmak, maliyetinizi ve performansınızı sorgu bazında anlamanıza yardımcı olur ve kullanımını optimize etmek için farklı sorgu kalıpları arasında hızlıca yineleme yapmanızı sağlar.
Sorgu açıklama seçeneklerini anlama: varsayılan ve analiz
Sorgu Açıklama işlemleri, varsayılan veya analiz et seçeneği kullanılarak gerçekleştirilebilir.
Varsayılan seçenekte, Query Explain sorguyu planlar ancak yürütme aşamasını atlar. Bu, planlayıcı aşaması bilgilerini döndürür. Bir sorgunun gerekli dizinlere sahip olup olmadığını kontrol etmek ve hangi dizinlerin kullanıldığını anlamak için bu aracı kullanabilirsiniz. Bu sayede, örneğin, belirli bir sorgunun birçok farklı dizinle kesişmek yerine bileşik dizin kullandığını doğrulayabilirsiniz.
Analiz seçeneğiyle Sorgu Açıklama, sorguyu hem planlar hem de yürütür. Bu işlem, sorgu yürütme çalışma zamanından elde edilen istatistiklerle birlikte daha önce bahsedilen tüm planlayıcı bilgilerini döndürür. Bu, sorgu yürütmeyle ilgili sistem düzeyinde analizlerin yanı sıra sorgunun fatura bilgilerini de içerir. Bu aracı, maliyet ve gecikmeyi optimize etmek için çeşitli sorgu ve dizin yapılandırmalarını test etmek amacıyla kullanabilirsiniz.
Sorgu Açıklama'nın maliyeti nedir?
Sorgu Açıklama'yı varsayılan seçenekle kullandığınızda herhangi bir dizin veya okuma işlemi yapılmaz. Sorgu karmaşıklığından bağımsız olarak bir okuma işlemi ücretlendirilir.
Query Explain'i 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.
Sorgu Açıklama'yı varsayılan seçenekle kullanma
Varsayılan seçenek isteği göndermek için istemci kitaplıklarını kullanabilirsiniz.
İsteklerin, normal sorgu işlemleri için kullanılan izinlerle IAM kullanılarak kimliğinin 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 başlıklı kılavuza bakın.
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çıklama raporu referansı bölümüne bakın.
Sorgu Açıklama'yı analiz seçeneğiyle kullanma
İstemci kitaplıklarını kullanarak bir analiz seçeneği isteği gönderebilirsiniz.
İsteklerin, normal sorgu işlemleri için kullanılan izinlerle IAM kullanılarak kimliğinin 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 başlıklı kılavuza bakın.
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
'ye 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çıklama raporu referansı bölümüne bakın.
Sonuçları yorumlama ve düzenlemeler yapma
Şimdi tür ve yapım ülkesine göre filmleri sorguladığımız bir örnek senaryoya bakalım.
Örnek olarak, 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 iki tek alanlı dizinde ((category ASC, __name__ ASC)
ve (country ASC, __name__ ASC)
) ç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ülme performansını optimize etmek için tamamen kapsanan bir bileş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", } } }