Referensi eksekusi kueri
Halaman ini menjelaskan output kueri yang dieksekusi 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 data digunakan secara umum untuk merujuk pada dokumen atau entri indeks.
Variabel
Variabel internal berikut dapat muncul di node eksekusi:
__key__
-kunci adalah ID internal untuk dokumen. Ini adalah ID unik absolut dengan project, database, dan jalur lengkap dokumen.__id__
-ID adalah ID unik untuk dokumen dalam koleksinya. ID ini bersifat unik dalam satu koleksi.__$0__…__$N__
-ini adalah variabel khusus konteks yang dibuat atau direferensikan dalam hierarki eksekusi. Variabel ini biasanya digunakan untuk merujuk ke konten dokumen atau nilai ekspresi yang dievaluasi selama eksekusi kueri.
Pertimbangkan contoh saat node ekstensi digunakan untuk mengekstrak
__id__
dari dokumen __key__
:
Extend
| expressions: [_id(__key__) AS __id__]
| 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
dalam 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, 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
,
batasan sesuai dengan 1 < a <= 5 OR a = 10
:
| constraints: /
|----(1L, 5L]
|----[10L]
Variabel Utama
Di beberapa node pemindaian (seperti SequentialScan
), ada daftar kunci sebagai
bagian dari atribut index
, dan atribut keys
terpisah di node Scan
. Atribut
keys
di node Scan
menunjukkan nama variabel dari setiap kunci dalam
definisi indeks, secara berurutan. Variabel dapat digunakan untuk mereferensikan nilai runtime
kolom yang dipindai lebih jauh di hierarki eksekusi.
Pada contoh berikut, nilai kolom user
untuk dokumen saat ini
dipetakan ke variabel __$6__
dan nilai date_placed
ke __$7__
.
index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __path__ ASC]
keys: [__$6__ ASC, __$7__ ASC, __path__ ASC]
Node Eksekusi
Hierarki eksekusi kueri dapat berisi node berikut.
SeekingScan
Merepresentasikan pemindaian dinamis dengan baris yang ditampilkan mungkin tidak berada di sepanjang satu rentang berurutan indeks, dan beberapa pemindaian berbeda harus dilakukan untuk memenuhi kueri.
Misalnya, kueri dengan a
ada dan b
sama dengan 1 yang bekerja pada
indeks ["a" ASC, "b" ASC]
, harus memindai dan menampilkan rentang terpisah,
yang berpotensi non-sekuensial untuk setiap nilai a
yang berbeda.
Ini lebih efisien daripada TableScan
lengkap, tetapi kurang efisien daripada 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: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| properties: Selection { user }
| records returned: 1
| records scanned: 1
SequentialScan
Merepresentasikan pemindaian rentang baris statis dan berurutan dalam penyimpanan yang dapat dilakukan dalam satu operasi baca.
key ordering length
mengacu 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 menurut
k1, tetapi baris dengan nilai k1 yang sama dapat memiliki 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: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| limit: 10
| properties: Selection { a }
| ranges: /
| records returned: 1
| records scanned: 1
UniqueScan
Merepresentasikan 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: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| properties: Selection { a }
| ranges: /
|----(-∞..+∞)
| records returned: 1
| records scanned: 1
TableAccess
Menghubungkan kembali ID baris yang disediakan ke konten baris yang 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
TableScan
Pemindaian koleksi lengkap yang tidak diurutkan. Digunakan saat kueri dijalankan tanpa indeks terkait.
Urutan dapat berupa STABLE
atau UNDEFINED
, dengan STABLE
menunjukkan
urutan deterministik.
• TableScan
| order: STABLE
| properties: *
| records returned: 1
| records scanned: 1
| source: (default)#/**/collection
HashAggregate
Implementasi operasi agregat yang didukung hash. Memerlukan materialisasi grup lengkap dalam memori sebelum menampilkan hasilnya dan tidak boleh melebihi batas memori kueri.
• HashAggregate
| aggregations: [sum(__$0__) AS total]
| groups: [a]
| peak memory usage: 4.00 KiB (4,096 B)
| records returned: 0
StreamAggregate
Node agregat khusus yang hanya mempertahankan status untuk satu grup pada satu waktu, sehingga mengurangi penggunaan memori puncak. Digunakan saat node turunan pokok akan menampilkan grup secara berurutan. Misalnya, saat mengelompokkan berdasarkan nilai kolom yang berbeda saat menggunakan indeks pada kolom tersebut.
• StreamAggregate
| keys: [foo ASC, bar ASC]
| properties: Selection { baz }
| aggregations: [$sum(foo) AS baz]
MajorSort
Melakukan operasi pengurutan pada kumpulan properti tetap. Mewujudkan semua kumpulan data di memori sekaligus dan menampilkan nilai yang diurutkan secara berurutan, ukuran kumpulan urutan dibatasi oleh batas memori kueri.
Jika batas berikutnya diberikan, algoritma pengurutan top-k akan digunakan untuk mengurangi penggunaan memori. Dengannya, pengurutan dapat dilakukan pada kumpulan data yang besar secara arbitrer selama memori yang digunakan dengan menyimpan elemen k yang dipertimbangkan tidak melebihi batas.
• MajorSort
| fields: [a ASC, b DESC]
| limit: 10
| peak memory usage: 4.00 KiB (4,096 B)
| records returned: 1
Concat
Menggabungkan hasil dari 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 bersifat nondeterministik.
• Concat
├── • TableAccess
...
├── • TableAccess
Batasi
Memproyeksikan kumpulan properti yang akan diteruskan ke node induknya. Mengurangi penggunaan memori dengan mencegah penyebaran kolom yang tidak digunakan segera setelah kolom tersebut tidak relevan dengan kueri lainnya.
• Restrict
| expressions: [foo AS foo, bar AS bar]
| records returned: 0
Perpanjang
Menambahkan kumpulan kolom ke setiap baris dalam set hasil. Digunakan saat menambahkan kolom ke dokumen dan sebagai node perantara untuk mendukung operasi yang lebih kompleks.
• Extend
| expressions: ["bar" AS foo]
| 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
Nilai
Menghasilkan urutan nilai literal yang akan dikerjakan. Digunakan terutama saat kumpulan daftar dokumen disediakan sebagai input ke kueri.
• Values
| expression: [{__key__=/col/1}, {__key__=/col/2}]
ReplaceWith
Mengganti kolom baris yang dihasilkan oleh node turunan dengan kolom dari ekspresi map
yang disediakan.
• ReplaceWith
| map: map("full_name", str_concat(first_name, " ", last_name)), current_context())
| records returned: 1
Batalkan penyusunan bertingkat
Menghapus susunan bertingkat 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
Melewati jumlah baris yang ditetapkan yang dihasilkan oleh node turunan.
• Offset
| offset: 10
| records returned: 1
Lepaskan
Menghapus kumpulan kolom yang ditentukan dari hasil yang dihasilkan oleh node turunan.
• Drop
| fields to drop: [__key__]
| records returned: 1