Yavaş sorgularla ilgili sorunları gidermek için sorgu yürütme planını ve çalışma zamanı yürütme profilini almak üzere Query Explain'i kullanın. Aşağıdaki bölümde, yürütme profiline bağlı olarak sorgu performansını optimize etmek için uygulayabileceğiniz adımlar açıklanmaktadır:
Sonuç sayısını sınırlama
Sorgunun çok sayıda doküman döndürüp döndürmediğini belirlemek için yürütme ağacındaki döndürülen kayıtlar alanını kullanın. limit(...) aşamasını kullanarak döndürülen doküman sayısını sınırlayabilirsiniz. Bu, sonuçlar ağ üzerinden istemcilere döndürüldüğünde sonuçların serileştirilmiş bayt boyutunu küçültür. Limit düğümünden önce MajorSort düğümünün geldiği durumlarda sorgu motoru, Limit ve MajorSort düğümlerini birleştirebilir ve tam bellek içi somutlaştırma ile sıralama yerine TopN sıralaması kullanarak sorgu için gereken bellek miktarını azaltabilir.
Sonuç Belgesinin Boyutunu Sınırlama
Yalnızca gerekli alanları döndürmek için select(...) kullanarak veya aşırı büyük alanları silmek için remove_fields(...) kullanarak döndürülen belgenin boyutunu sınırlayabilirsiniz. Bu, ara sonuçların işlenmesiyle ilgili işlem ve bellek maliyetini azaltmaya yardımcı olur. Ayrıca, sonuçlar ağ üzerinden istemcilere döndürüldüğünde sonuçların seri hale getirilmiş bayt boyutunu da azaltır. Sorguda referans verilen tüm alanların normal bir dizinle kapsandığı durumlarda bu, sorgunun dizin taramasıyla tamamen kapsanmasına da olanak tanır ve dokümanların birincil depolama alanından getirilmesi ihtiyacını ortadan kaldırır.
Dizinleri kullanma
Dizinleri oluşturmak ve optimize etmek için aşağıdaki talimatları uygulayın.
Sorgunun dizin kullanıp kullanmadığını belirleme
Sorgunun dizin kullanıp kullanmadığını, yürütme ağacındaki yaprak düğümleri kontrol ederek belirleyebilirsiniz. Yürütme ağacının yaprak düğümü bir TableScan düğümü ise sorgunun dizin kullanmadığı ve birincil depolamadaki dokümanları taradığı anlamına gelir. Bir dizin kullanılıyorsa yürütme ağacının yaprak düğümünde dizinin dizin kimliği ve dizin alanları gösterilir.
Daha iyi bir dizin belirleme
Bir dizin, sorgu motorunun birincil depolamadan getirmesi gereken doküman sayısını azaltabiliyorsa veya alan sıralaması sorgunun sıralama koşulunu karşılayabiliyorsa sorgu için yararlıdır.
Bir sorgu için dizin kullanılıyorsa ancak sorgu motoru, çok sayıda kayıt döndüren bir Tarama düğümü ve ardından az sayıda kayıt döndüren bir Filtre düğümü ile tanımlandığı gibi, yine de birçok belgeyi getirip atıyorsa bu, dizin kullanılarak karşılanan sorgu yükleminin seçici olmadığına dair bir işarettir. Daha uygun bir dizin oluşturmak için Dizin oluşturma başlıklı makaleyi inceleyin.
Bir sorgu için dizin kullanılıyorsa ancak sorgu motoru, sorgu yürütme ağacındaki MajorSort düğümü ile tanımlandığı gibi sonuç kümesinin bellek içi yeniden sıralamasını yapmaya devam ediyorsa bu, kullanılan dizinin sorgunun sıralama şartını karşılamak için kullanılamadığının bir işaretidir. Daha uygun bir dizin oluşturmak için sonraki bölüme bakın.
Dizin Oluşturma
Dizin oluşturmak için dizin yönetimi dokümanlarını inceleyin. Sorgunuzun dizinleri kullanabilmesi için aşağıdaki sırayla alanlar içeren normal (çok anahtarlı olmayan) dizinler oluşturun:
- Eşitlik operatörlerinde kullanılacak tüm alanlar. Sorgular arasında yeniden kullanım şansını en üst düzeye çıkarmak için alanları, sorgular arasındaki eşitlik operatörlerinde alanların oluşum sıklığına göre azalan sırada düzenleyin.
- Sıralanacak tüm alanlar (aynı sırada).
- Sorgu kısıtlaması seçiciliğinin azalan sırasına göre aralık veya eşitsizlik operatörlerinde kullanılacak alanlar.
- Dizindeki bir sorgunun parçası olarak döndürülecek alanlar: Bu alanların dizine dahil edilmesi, dizinin sorguyu kapsamasına ve birincil depolama alanından doküman getirmesine gerek kalmamasına olanak tanır.
Dizin veya tablo taraması zorlama
Cloud Firestore sorgusu yaptığınızda, sorguyu daha verimli hale getirme olasılığı olan tüm dizinler otomatik olarak kullanılır. Bu nedenle, sorgularınız için bir dizin belirtmeniz gerekmez. Ancak iş yükünüz için kritik olan sorgularda daha tutarlı performans elde etmek amacıyla forceIndex seçeneğini kullanmanızı öneririz.
Bazı durumlarda Cloud Firestore, sorgu gecikmesinin artmasına neden olan bir dizin seçebilir. Performans düşüşleriyle ilgili sorun giderme adımlarını uyguladıysanız ve sorgu için farklı bir dizin denemenin mantıklı olduğunu onayladıysanız forceIndex seçeneğini kullanarak dizini belirtebilirsiniz.
forceIndex seçeneğini, Cloud Firestore'nin varsayılan sorgu planını geçersiz kılmak, kullanılacak bir dizin belirtmek veya tablo taraması zorlamak için ardışık düzen işlemlerindeki herhangi bir giriş aşamasında kullanabilirsiniz.
Belirli bir dizini zorunlu kılma
Sorgunun belirli bir dizini kullanmasını zorlamak için dizin kimliğini forceIndex seçeneğine dize olarak girin. Dizin kimliğini konsoldan veya hata mesajlarından bulabilirsiniz.
Aşağıdaki örnek, planlayıcıyı CICAgOi36pgK kimlikli dizini kullanmaya zorlar:
Node.js
// Force Planner to use Index ID CICAgOi36pgK await db.pipeline() .collectionGroup({ collectionId: "customers", forceIndex: "CICAgOi36pgK" }) .limit(100) .execute();
Java
// Force Planner to use Index ID CICAgOi36pgK Pipeline.Snapshot results1 = firestore.pipeline() .collectionGroup("customers", new CollectionGroupOptions() .withHints(new CollectionHints().withForceIndex("CICAgOi36pgK"))) .limit(100) .execute().get();
Go
// Force Planner to use Index ID CICAgOi36pgK snapshot1 := client.Pipeline(). CollectionGroup("customers", firestore.WithForceIndex("CICAgOi36pgK")). Limit(100). Execute(ctx)
Belirli bir dizini zorunlu kılmaya yönelik bazı kullanım alanları şunlardır:
- Farklı dizinlerin performansını test etme
- Bir sorgu için belirli ve bilinen en uygun dizinin kullanılmasını sağlama.
- Varsayılan seçimi belirli bir sorgu için ideal olmayan durumlarda optimize ediciyi geçersiz kılma.
Belirtilen dizin bulunamazsa sorgu başarısız olur.
Tablo taraması zorlama
Tablo taraması, koleksiyondaki veya koleksiyon grubundaki dokümanları herhangi bir ikincil dizin kullanmadan okur. Tablo taraması zorlamak için forceIndex değerini primary olarak ayarlayın.
Aşağıdaki örnek, tablo taraması yapmaya zorlar:
// Force Planner to only do a Full-Table Scan
db.pipeline()
.collectionGroup({ collectionId: "customers", forceIndex: "primary" })
.limit(100)
Aşağıdaki durumlarda tablo taraması kullanabilirsiniz:
- Dizin ek yükünün haklı gösterilemediği çok küçük koleksiyonlar için.
- Bir koleksiyondaki dokümanların çoğuna erişen sorgular için.
- Hata ayıklama ve performans karşılaştırmaları için.
Sorgu Açıklama ile forceIndex kullanma
forceIndex etkilerini gözlemlemek için özellikle analyze seçeneğiyle birlikte Sorgu Açıklama'yı kullanabilirsiniz:
- Yürütme ağacının yaprak düğümlerinde dizin kimliğini kontrol ederek Cloud Firestore'nın
forceIndexiçinde belirtilen dizini kullandığını doğrulayın. forceIndex: "primary"kullanılırken plandaTableScandüğümünün göründüğünü onaylayın.- Sorgu performansını optimize etmek için gecikme, taranan dokümanlar ve taranan dizin girişleri gibi performans metriklerini
forceIndexile veforceIndexolmadan karşılaştırın.
forceIndex ile ilgili en iyi uygulamalar
forceIndex, sorgu yürütme üzerinde daha fazla kontrol sağlarken Cloud Firestore'nin sorgu optimizasyon aracı çoğu kullanım alanı için genellikle verimlidir.
forceIndex kullanırken aşağıdaki en iyi uygulamalardan yararlanabilirsiniz:
forceIndexözelliğini dikkatli bir şekilde kullanın. Varsayılan sorgu planıyla optimumun altında bir performans gözlemlerseniz bir dizini zorlamadan önce sorunu teşhis etmek için Sorgu Açıklaması'nı kullanın.forceIndexkullanırken sorgularınızın performans ve maliyet özelliklerini anlamak için sorgularınızı gerçekçi veri hacimleriyle test ettiğinizden emin olun.- Üretim ortamlarındaki büyük koleksiyonlarda
forceIndex: "primary"kullanmaktan kaçının.