Bu sayfada, Query Explain ile yürütülen bir sorgunun çıkışı açıklanmaktadır. Query Explain ile sorgu yürütmeyi öğrenmek için Query Explain ile sorgu yürütmeyi analiz etme başlıklı makaleyi inceleyin.
Sık Kullanılan Kavramlar
Yürütme ağacında aşağıdaki yaygın kavramlar ve terimler kullanılır.
Satırlar ve kayıtlar
Satır ve kayıt terimleri, genel olarak bir dokümanı veya dizin girişini ifade etmek için kullanılır.
Değişkenler
$, yürütme ağacında oluşturulan veya referans verilen bir değişkeni belirtir. Örneğin: $foo_1. Bu değişkenler genellikle bir belgenin içeriğine veya bir sorgunun yürütülmesi sırasında değerlendirilen bir ifadenin değerine atıfta bulunmak için kullanılır.
Yürütme düğümlerinde aşağıdaki dahili değişkenler görünebilir:
$__key__: Anahtar, bir dokümanın dahili tanımlayıcısıdır. Bu, proje, veritabanı ve dokümanın tam yolunu içeren mutlak ve benzersiz bir tanımlayıcıdır.$__id__: Kimlik, koleksiyonundaki bir doküman için benzersiz bir tanımlayıcıdır. Bu, tek bir koleksiyon içinde benzersizdir.$rid: Satır kimliği, depolama alanındaki bir dokümanın dahili tanımlayıcısıdır. Bu, tek bir koleksiyon içinde benzersizdir.
__key__ dokümanından __id__ değerini hesaplamak için Compute düğümünün kullanıldığı bir örneği ele alalım:
Compute
| $__id__1: _id($__key__)
| records returned: 1
Kısıtlamalar ve aralıklar
Bazı tarama düğümleri, taranan değerlerin aralığını açıklamak için constraints ve ranges özelliklerini kullanır. Bu özellikler, değer listesi içeren bir aralık ağacı biçimi kullanır. Bu değerler, dizin tanımında görünen sıralı anahtar listesine karşılık gelir. Örneğin, ağaçta görünen ilk aralık (burada (1..5]), sıralı anahtar listesindeki ilk anahtarla (burada a) ilgili kısıtlamalara karşılık gelir:
| index: type=CollectionGroupIndex, id=CICAgOjXh#EK, keys=[a ASC, b ASC, __key__ ASC]
| constraints: /
|----(1..5]
|----[1L]
Her girinti düzeyi, listedeki bir sonraki anahtar için geçerli olan kısıtlamayı gösterir. Köşeli parantezler dahil olan aralığı, normal parantezler ise hariç tutulan aralığı temsil eder. Bu durumda kısıtlama 1 < "a" <= 5 ve "b" = 1 olarak çevrilir.
a için birden fazla dalın bulunduğu aşağıdaki örnekte kısıtlama 1 < a <= 5 OR a = 10 değerine karşılık gelir:
| constraints: /
|----(1L, 5L]
|----[10L]
Temel Değişkenler
Bazı tarama düğümlerinde (ör. SequentialScan), hem index özelliğinin bir parçası olarak anahtar listesi hem de Scan düğümünde ayrı bir keys özelliği bulunur. Scan düğümündeki keys özelliği, dizin tanımındaki her anahtarın değişken adını sırayla belirtir. Değişkenler, yürütme ağacının daha üst kısımlarında taranan alanın çalışma zamanı değerlerine referans vermek için kullanılabilir.
Aşağıdaki örnekte, geçerli belgenin user alanının değeri $user_1 değişkeniyle, date_placed alanının değeri ise $date_placed_1 değişkeniyle eşlenir.
index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __key__ ASC]
keys: [user ASC, date_placed ASC, __key__ ASC]
Yürütme Düğümleri
Sorgu yürütme ağacı aşağıdaki düğümleri içerebilir.
SeekingScan
Döndürülen satırların dizinin tek bir sıralı aralığında olmayabileceği ve sorguyu karşılamak için birden fazla farklı taramanın yapılması gereken dinamik bir taramayı temsil eder.
Örneğin, a değerinin mevcut olduğu ve b değerinin 1'e eşit olduğu bir sorgu, ["a" ASC, "b" ASC] dizini üzerinde çalışırken a değerinin her bir farklı değeri için ayrı ve potansiyel olarak sıralı olmayan bir aralığı tarayıp döndürmelidir.
Bu, tam bir TableScan işleminden daha verimli ancak ["b" ASC, "a" ASC] bileşik dizininde tek bir SequentialScan işleminden daha az verimlidir.
• SeekingScan
| constraints: /
|----(-∞..+∞)
|----[1L]
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, quantity ASC, __key__ ASC]
| keys: [user ASC, quantity ASC, __key__ ASC]
| properties: Selection { user }
| records returned: 1
| records scanned: 1
SequentialScan
Depolama alanında tek bir okuma işleminde gerçekleştirilebilecek statik, sıralı bir satır aralığının taranmasını temsil eder.
key ordering length, korunması ve orijinal anahtar sırasına göre döndürülmesi gereken anahtar sayısını ifade eder. [k1, k2, k3] şeması için anahtar sıralama uzunluğunun 0 olması, taramanın herhangi bir sırada döndürülebileceği anlamına gelir. 1, k1'e göre sıralama anlamına gelir ancak aynı k1 değerine sahip satırlar herhangi bir sırada gelebilir. 3, dokümanları tam sıralı düzende döndürür.
• SequentialScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| key ordering length: 3
| keys: [user ASC, date_placed ASC, __key__ ASC]
| limit: 10
| properties: Selection { a }
| ranges: /
| records returned: 1
| records scanned: 1
UniqueScan
Depolama alanındaki statik, sıralı bir satır aralığının, satırların bellek içi tekilleştirilmesiyle taranmasını temsil eder.
• UniqueScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| keys: [user ASC, date_placed ASC, __key__ ASC]
| properties: Selection { a }
| ranges: /
|----(-∞..+∞)
| records returned: 1
| records scanned: 1
IndexSeek
Döndürülen satırların çalışma zamanı verileriyle parametreleştirilebileceği ve dizinin tek bir sıralı aralığında olmayabileceği dinamik bir taramayı temsil eder. Sorguyu karşılamak için birden fazla farklı tarama yapılabilir.
Örneğin, user değerinin $user_id değerine ve date_placed değerinin "2025-08-10" değerine eşit olduğu bir sorgu, ["user" ASC, "date_placed" ASC] dizininde çalışırken çalışma zamanında $user_id değişkeninin değerini ve tarama aralıklarını kısıtlamak için date_placed üzerindeki "2025-08-10" kısıtlamasını kullanır.
• IndexSeek
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| fields: [$user_1 ASC, $date_placed_1 ASC, $rid ASC]
| key: $key_1
| filter: $eq($user_1, $user_id) AND $eq($date_placed_1, "2025-08-10")
| records returned: 1
| records scanned: 1
Getir
Sağlanan satırın tanımlayıcısını birincil depolama alanındaki gerçek satır içeriklerine yeniden birleştirir. Üst düğüm (veya nihai sorgu sonucu) belgelerdeki alanların bir alt kümesini gerektiriyorsa Fetch zorunludur.
• Fetch
| order: PRESERVE_INPUT_ORDER
| peak memory usage: 4.00 KiB (4,096 B)
| properties: *
| records returned: 1
TableScan
Bir koleksiyonun tam ve sırasız taraması. Sorgu, ilişkili bir dizin olmadan çalıştırıldığında kullanılır.
Sıra, STABLE veya UNDEFINED olabilir. STABLE, deterministik bir sıralamayı belirtir.
• TableScan
| order: STABLE
| properties: *
| records returned: 1
| records scanned: 1
| source: (default)#/**/collection
Gönder
input tablosunun her satırını iterasyonla işleyip her satır için map tablosunu tarayarak ve sonuçları döndürerek iki veri kümesi (input ve map) arasında birleştirme işlemi gerçekleştirir.
join_type, birleştirme türünü gösterir. Örneğin, LEFT_OUTER, input tablosundaki tüm satırların çıkışa en az bir kez dahil edildiği anlamına gelir.
Bir input satırı, map tarafında herhangi bir sonuç bulamazsa map tarafındaki sütunlar için null değerleriyle birlikte dahil edilir.
• Apply
| join_type: LEFT_OUTER
|
└── • input tree
| ...
└── • map tree
...
HashAggregate
Toplu işlemlerin karma destekli uygulaması. Sonuç döndürülmeden önce tüm grubun bellekte somutlaştırılmasını gerektirir ve sorgu bellek sınırını aşmamalıdır.
• HashAggregate
| aggregations: [sum($b_1) AS total]
| groups: [$a_1]
| peak memory usage: 4.00 KiB (4,096 B)
| records returned: 0
StreamAggregate
Aynı anda yalnızca tek bir grubun durumunu koruyarak en yüksek bellek kullanımını azaltan özel bir toplama düğümü. Temel alt düğüm, grupları sırayla döndürdüğünde kullanılır. Örneğin, bir alanın farklı değerlerine göre gruplandırma yaparken bu alanda bir dizin kullanıyorsanız.
• StreamAggregate
| keys: [foo ASC, bar ASC]
| properties: Selection { baz }
| aggregations: [$sum($foo_1) AS baz]
MajorSort
Sabit bir özellik grubu üzerinde sıralama işlemi gerçekleştirir. Bellekteki tüm kayıtları tek seferde somutlaştırır ve sıralanan değerleri sırayla döndürür. Sıralama kümesinin boyutu, sorgu bellek sınırı ile sınırlıdır.
Sonraki bir sınır sağlandığında, bellek kullanımını azaltmak için bir top-k sıralama algoritması kullanılır. Bu sayede, dikkate alınan k öğenin depolanması için kullanılan bellek sınırı aşılmadığı sürece, rastgele büyüklükteki bir kayıt kümesinde sıralama yapılabilir.
• MajorSort
| fields: [a ASC, b DESC]
| limit: 10
| peak memory usage: 4.00 KiB (4,096 B)
| records returned: 1
Concat
Birden fazla alt düğümün sonuçlarını birleştirir ve sonucu üst düğüme döndürür. Bu düğüm, birden fazla alt öğede görünen sonuçları tekilleştirmez ve döndürülen sonuçların sırası belirsizdir.
• Concat
├── • Fetch
...
├── • Fetch
İşlem
Bir dizi ifadeyi değerlendirir ve sonuçları bir dizi değişkene atar.
• Compute
| $user_1: user
| $full_name_1: str_concat($first_name_1, " ", $last_name_1)
| $address_1: UNSET
| records returned: 1
Filtre
Yalnızca sağlanan ifadeyle eşleşen satırları seçerek döndürür.
• Filter
| expression: $eq(foo, "bar")
| records returned: 1
RecordCount
Alt düğüm tarafından üretilen satır sayısını sayar ve geçerli sayıyı count özelliğinde belirtilen değişkene gönderir.
• RecordCount
| count: $row_number_1
| records returned: 1
Değerler
Üzerinde çalışılacak bir değişmez değer dizisi oluşturur. Genellikle bir sorguya giriş olarak belirli bir belge listesi sağlandığında kullanılır.
• Values
| expression: [{__key__=/col/1}, {__key__=/col/2}]
Unnest
Alt düğüm tarafından üretilen değeri iç içe yerleştirmez.
• Unnest
| expression: foo AS unnested_foo
Sınır
Üst düğüme döndürülen satır sayısını sınırlar.
• Limit
| limit: 10
| records returned: 1
Başlangıç
Alt düğüm tarafından üretilen belirli sayıda satırı atlar.
• Offset
| offset: 10
| records returned: 1