Referensi eksekusi kueri
Halaman ini menjelaskan output kueri yang dijalankan dengan Query Explain. Untuk mempelajari cara menjalankan kueri dengan Query Explain, lihat Menganalisis eksekusi kueri dengan Query Explain.
Konsep Umum
Konsep dan istilah umum berikut digunakan di seluruh hierarki eksekusi.
Baris dan kumpulan data
Istilah baris dan kumpulan data digunakan untuk merujuk ke dokumen atau entri indeks secara umum.
Variabel
$
menunjukkan variabel yang dibuat atau
direferensikan dalam hierarki eksekusi. Contoh: $foo_1
. Variabel ini biasanya digunakan untuk
merujuk pada isi dokumen atau nilai ekspresi yang dievaluasi
selama eksekusi kueri.
Variabel internal berikut dapat muncul di node eksekusi:
$__key__
- key adalah ID internal untuk dokumen. ID ini bersifat unik dan absolut bagi project, database, dan jalur lengkap dokumen.$__id__
- ID adalah ID unik untuk dokumen dalam koleksinya. ID ini bersifat unik dalam satu koleksi.$rid
- ID baris adalah ID internal untuk dokumen dalam penyimpanan. ID ini bersifat unik dalam satu koleksi.
Pertimbangkan contoh saat node Compute
digunakan untuk mengomputasi
__id__
dari dokumen __key__
:
Compute
| $__id__1: _id($__key__)
| records returned: 1
Batasan dan rentang
Beberapa node pemindaian menggunakan atribut constraints
dan ranges
untuk mendeskripsikan rentang
nilai yang dipindai. Atribut ini menggunakan format hierarki rentang yang
berisi daftar nilai. Nilai ini sesuai dengan daftar kunci yang diurutkan
yang muncul dalam definisi indeks. Misalnya, rentang pertama yang muncul
di hierarki, di sini (1..5]
, sesuai dengan batasan pada kunci pertama,
di sini a
, dalam daftar kunci yang diurutkan:
| index: type=CollectionGroupIndex, id=CICAgOjXh#EK, keys=[a ASC, b ASC, __key__ ASC]
| constraints: /
|----(1..5]
|----[1L]
Setiap tingkat indentasi menunjukkan batasan yang berlaku untuk kunci berikutnya dalam
daftar. Tanda kurung siku mewakili rentang inklusif, sementara tanda kurung bulat adalah
rentang eksklusif. Dalam hal ini, batasan diterjemahkan menjadi 1 < "a" <= 5
, dan
"b" = 1
.
Dalam contoh berikut dengan beberapa cabang untuk a
,
batasannya sesuai dengan 1 < a <= 5 OR a = 10
:
| constraints: /
|----(1L, 5L]
|----[10L]
Variabel Utama
Dalam beberapa node pemindaian (seperti SequentialScan
), terdapat daftar kunci sebagai
bagian dari atribut index
serta atribut keys
yang terpisah di node Scan
. Atribut
keys
di node Scan
menunjukkan nama variabel setiap kunci dalam
definisi indeks, secara berurutan. Variabel dapat digunakan untuk mereferensikan nilai runtime
dari kolom yang dipindai dalam puncak hierarki eksekusi.
Dalam contoh berikut, nilai kolom user
untuk dokumen saat ini
memetakan ke variabel $user_1
dan nilai date_placed
ke $date_placed_1
.
index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __key__ ASC]
keys: [user ASC, date_placed ASC, __key__ ASC]
Node Eksekusi
Hierarki eksekusi kueri dapat berisi node berikut.
SeekingScan
Menampilkan pemindaian dinamis tempat baris yang ditampilkan mungkin tidak berada dalam satu rentang indeks berurutan dan beberapa pemindaian berbeda harus dilakukan untuk memenuhi kueri.
Misalnya, kueri tempat a
berada dan b
sama dengan 1 yang berfungsi pada
indeks ["a" ASC, "b" ASC]
perlu memindai dan menampilkan rentang terpisah
yang kemungkinan besar tidak berurutan untuk setiap nilai a
yang berbeda.
Cara ini lebih efisien dibandingkan TableScan
penuh, tetapi kurang efisien dibandingkan satu
SequentialScan
pada indeks komposit ["b" ASC, "a" ASC]
.
• 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
Menunjukkan pemindaian rentang baris statis dan berurutan dalam penyimpanan yang dapat dijalankan dalam satu operasi baca.
key ordering length
merujuk pada jumlah kunci yang harus dipertahankan
dan ditampilkan dalam urutan kunci asli. Untuk skema [k1, k2, k3]
, panjang
pengurutan kunci 0 berarti pemindaian dapat ditampilkan dalam urutan apa pun, 1 berarti urutan berdasarkan
k1, tetapi baris dengan nilai k1 yang sama dapat ditampilkan dalam urutan apa pun, 3 menampilkan dokumen
dalam urutan yang diurutkan persis.
• 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
Menampilkan pemindaian rentang baris statis dan berurutan dalam penyimpanan dengan penghapusan duplikat baris dalam memori.
• 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
Menampilkan pemindaian dinamis tempat baris yang ditampilkan dapat diparameterkan oleh data runtime dan mungkin tidak berada dalam satu rentang indeks berurutan, dan beberapa pemindaian berbeda dapat dilakukan untuk memenuhi kueri.
Misalnya, kueri tempat user
sama dengan $user_id
dan date_placed
sama dengan
"2025-08-10"
yang berjalan pada indeks ["user" ASC, "date_placed" ASC]
, akan
menggunakan nilai variabel $user_id
saat runtime dan batasan "2025-08-10"
pada date_placed
untuk membatasi rentang pemindaian.
• 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
TableAccess
Menggabungkan kembali ID baris yang diberikan ke konten baris sebenarnya dari penyimpanan
utama. TableAccess
diperlukan jika node induk (atau hasil kueri akhir)
memerlukan subset kolom dari dokumen.
• TableAccess
| order: PRESERVE_INPUT_ORDER
| peak memory usage: 4.00 KiB (4,096 B)
| properties: *
| records returned: 1
LookupById
Melakukan penggabungan dengan mencari dokumen dalam koleksi asing berdasarkan ID dokumen. ID yang akan dicari berasal dari kolom dalam dokumen input. Hasil pencarian ditambahkan sebagai kolom baru ke dokumen input.
• LookupById
| local_field: $localField_1
| foreign_datasource: (default)#/**/foreign
| output: $output_1
TableScan
Pemindaian lengkap dan tidak berurutan dari koleksi. Digunakan saat kueri dijalankan tanpa indeks terkait.
Urutan dapat berupa STABLE
atau UNDEFINED
, dengan STABLE
menunjukkan
pengurutan determenistik.
• TableScan
| order: STABLE
| properties: *
| records returned: 1
| records scanned: 1
| source: (default)#/**/collection
NestedLoopJoin
Melakukan penggabungan antara dua set data (kiri dan kanan) dengan melakukan iterasi
melalui setiap baris input kiri dan, untuk setiap baris kiri, memindai
input kanan untuk mencari baris yang cocok berdasarkan join_condition
.
join_type
menunjukkan jenis gabungan. Misalnya, LEFT_OUTER
berarti semua baris dari input kiri disertakan setidaknya sekali dalam output.
Jika baris kiri tidak cocok dengan baris mana pun dalam input kanan berdasarkan
join_condition
, baris tersebut akan tetap disertakan, dengan nilai null untuk
kolom dari input kanan.
• NestedLoopJoin
| join_type: LEFT_OUTER
| join_condition: $eq($left, $right)
|
└── • left tree
| ...
└── • right tree
...
HashAggregate
Implementasi operasi gabungan yang didukung hash. Memerlukan pembentukan grup lengkap dalam memori sebelum menampilkan hasil dan tidak boleh melebihi batas memori kueri.
• HashAggregate
| aggregations: [sum($b_1) AS total]
| groups: [$a_1]
| peak memory usage: 4.00 KiB (4,096 B)
| records returned: 0
StreamAggregate
Node gabungan khusus yang hanya mempertahankan status untuk satu grup dalam satu waktu, sehingga mengurangi penggunaan memori puncak. Digunakan saat node turunan yang mendasarinya akan menampilkan grup secara berurutan. Misalnya, saat mengelompokkan menurut nilai unik dari kolom selagi menggunakan indeks pada kolom tersebut.
• StreamAggregate
| keys: [foo ASC, bar ASC]
| properties: Selection { baz }
| aggregations: [$sum($foo_1) AS baz]
MajorSort
Menjalankan operasi pengurutan pada rangkaian properti yang telah ditetapkan. Membuat semua kumpulan data dalam memori sekaligus dan menampilkan nilai yang diurutkan secara berurutan. Ukuran set pengurutan dibatasi oleh batas memori kueri.
Jika batas berikutnya diberikan, algoritma pengurutan top-k akan digunakan untuk mengurangi penggunaan memori. Dengan demikian, pengurutan dapat dijalankan pada set kumpulan data yang sangat besar selama memori yang digunakan untuk menyimpan elemen yang dipertimbangkan k tidak melebihi batas.
• MajorSort
| fields: [a ASC, b DESC]
| limit: 10
| peak memory usage: 4.00 KiB (4,096 B)
| records returned: 1
Concat
Menyambungkan hasil beberapa node turunan dan menampilkan hasilnya ke node induk. Node ini tidak menghapus duplikat hasil yang muncul di beberapa turunan dan urutan hasil yang ditampilkan tidak determenistik.
• Concat
├── • TableAccess
...
├── • TableAccess
Compute
Mengevaluasi serangkaian ekspresi dan menetapkan hasilnya ke serangkaian variabel.
• Compute
| $user_1: user
| $full_name_1: str_concat($first_name_1, " ", $last_name_1)
| $address_1: UNSET
| records returned: 1
Filter
Menampilkan baris secara selektif jika dan hanya jika baris tersebut cocok dengan ekspresi yang diberikan.
• Filter
| expression: $eq(foo, "bar")
| records returned: 1
RecordCount
Menghitung jumlah baris yang dihasilkan oleh node turunan dan memancarkan jumlah saat ini ke variabel yang ditentukan dalam atribut count
.
• RecordCount
| count: $row_number_1
| records returned: 1
Nilai
Menghasilkan urutan nilai literal untuk dijalankan. Utamanya digunakan saat daftar dokumen disediakan sebagai input ke kueri.
• Values
| expression: [{__key__=/col/1}, {__key__=/col/2}]
Unnest
Menguraikan nilai yang dihasilkan oleh node turunan.
• Unnest
| expression: foo AS unnested_foo
Batas
Membatasi jumlah baris yang ditampilkan ke node induk.
• Limit
| limit: 10
| records returned: 1
Offset
Mengabaikan sejumlah baris yang dihasilkan oleh node turunan.
• Offset
| offset: 10
| records returned: 1