Bu sayfada, aralık ve eşitsizlik filtreleri uygulayarak birden fazla alanda eşitsizlik filtreleri uygulayarak verimli bir sorgu deneyimi oluşturabilirsiniz.
Reklamınızı optimize etmeden önce ilgili kavramlar hakkında bilgi edinin daha fazla bilgi edineceksiniz.
Sorgu Açıklaması ile sorguları optimize etme
Kullanılan sorgu ve dizinlerin optimum durumda olup olmadığını belirlemek için sorgunun sorgu planı özetini ve yürütme istatistiklerini almak üzere Sorgu Açıklaması'nı kullanabilirsiniz:
Java
Query q = db.collection("employees").whereGreaterThan("salary",
100000).whereGreaterThan("experience", 0);
ExplainResults<QuerySnapshot> explainResults = q.explain(ExplainOptions.builder().analyze(true).build()).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
ExecutionStats executionStats = metrics.getExecutionStats();
System.out.println(planSummary.getIndexesUsed());
System.out.println(stats.getResultsReturned());
System.out.println(stats.getExecutionDuration());
System.out.println(stats.getReadOperations());
System.out.println(stats.getDebugStats());
Node.js
let q = db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">",0);
let options = { analyze : 'true' };
let explainResults = await q.explain(options);
let planSummary = explainResults.metrics.planSummary;
let stats = explainResults.metrics.executionStats;
console.log(planSummary);
console.log(stats);
Aşağıdaki örnekte, doğru dizin sıralaması kullanmanın, Cloud Firestore'un taradığı dizin girişi sayısıdır.
Basit sorgular
Çalışanlardan oluşan bir koleksiyonun önceki örneğinde, basit sorgu
(experience ASC, salary ASC)
diziniyle çalışan aşağıdaki gibi çalışır:
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("experience")
.orderBy("salary");
Sorgu, 95.000 dizin girişini yalnızca 5 doküman döndürmek için tarar. Sorgu koşulu karşılanmadığından, çok sayıda dizin girişi okunur ancak filtrelenir.
// Output query planning info { "indexesUsed": [ { "properties": "(experience ASC, salary ASC, __name__ ASC)", "query_scope": "Collection" } ], // Output Query Execution Stats "resultsReturned": "5", "executionDuration": "2.5s", "readOperations": "100", "debugStats": { "index_entries_scanned": "95000", "documents_scanned": "5", "billing_details": { "documents_billable": "5", "index_entries_billable": "95000", "small_ops": "0", "min_query_cost": "0" } } }
Alan uzmanlığından, çoğu çalışanın en azından bir miktar deneyime sahip olduğu, ancak çok azının
100.000. Bu bilgiden yola çıkarak, salary
kısıtlamasının experience
kısıtlamasına göre daha seçici olduğu sonucuna varabiliriz. Cloud Firestore'un sorguyu yürütmek için kullandığı dizini etkilemek amacıyla salary
kısıtlamasını experience
kısıtlamasından önce sıralayan bir orderBy
ifadesi belirtin.
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("salary")
.orderBy("experience");
Koşulları eklemek için açıkça orderBy()
ifadesini kullandığınızda Cloud Firestore, (salary ASC, experience ASC)
emin olun. Dolayısıyla, bu sorguda ilk aralık filtresinin seçiciliği şuna kıyasla daha yüksek olduğu için:
Sorgu, daha hızlı çalışır ve daha uygun maliyetli olur.
// Output query planning info { "indexesUsed": [ { "properties": "(salary ASC, experience ASC, __name__ ASC)", "query_scope": "Collection" } ], // Output Query Execution Stats "resultsReturned": "5", "executionDuration": "0.2s", "readOperations": "6", "debugStats": { "index_entries_scanned": "1000", "documents_scanned": "5", "billing_details": { "documents_billable": "5", "index_entries_billable": "1000", "small_ops": "0", "min_query_cost": "0" } } }
Sonraki Adımlar
- Sorgu Açıklaması hakkında bilgi edinin.
- Dizine eklemeyle ilgili en iyi uygulamalar hakkında bilgi edinin.