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 pohon eksekusi.

Baris dan data

Istilah baris dan entri indeks digunakan untuk merujuk secara umum ke 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 dirujuk dalam pohon eksekusi. Variabel ini biasanya digunakan untuk merujuk pada konten dokumen atau nilai ekspresi yang dievaluasi selama eksekusi kueri.

Pertimbangkan contoh saat node perluasan 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 pohon 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, 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 setiap kunci dalam definisi indeks, secara berurutan. Variabel dapat digunakan untuk mereferensikan nilai runtime kolom yang dipindai lebih jauh di atas dalam pohon eksekusi.

Dalam 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

Pohon eksekusi kueri dapat berisi node berikut.

SeekingScan

Mewakili pemindaian dinamis yang baris yang ditampilkan mungkin tidak berada dalam satu rentang indeks berurutan, dan beberapa pemindaian berbeda harus dilakukan untuk memenuhi kueri.

Misalnya, kueri dengan a ada dan b sama dengan 1 yang berfungsi pada indeks ["a" ASC, "b" ASC], perlu memindai dan menampilkan rentang terpisah, yang berpotensi tidak berurutan untuk setiap nilai a yang berbeda. Cara ini lebih efisien daripada TableScan penuh, 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

Mewakili 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 urutkan 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: [__$1__ ASC, __$2__ 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: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| properties: Selection { a }
| ranges: /
          |----(-∞..+∞)
| 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

TableScan

Pemindaian koleksi secara penuh dan tidak berurutan. Digunakan saat kueri dijalankan tanpa indeks terkait.

Urutan dapat berupa STABLE atau UNDEFINED, dengan STABLE menunjukkan pengurutan 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 hasil 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 dalam satu waktu, sehingga mengurangi penggunaan memori puncak. Digunakan saat node turunan yang mendasarinya akan mengembalikan grup secara berurutan. Misalnya, saat mengelompokkan menurut nilai unik dari kolom sambil menggunakan indeks pada kolom tersebut.

• StreamAggregate
|  keys: [foo ASC, bar ASC]
|  properties: Selection { baz }
|  aggregations: [$sum(foo) AS baz]

MajorSort

Melakukan operasi pengurutan pada serangkaian properti tetap. Membuat semua rekaman 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 digunakan untuk mengurangi penggunaan memori. Dengan demikian, pengurutan dapat dilakukan pada set data yang sangat besar selama memori yang digunakan untuk menyimpan k elemen 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 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 deterministik.

• Concat
├── • TableAccess
...
├── • TableAccess

Batasi

Memproyeksikan serangkaian properti untuk diteruskan ke node induknya. Mengurangi penggunaan memori dengan mencegah propagasi kolom yang tidak digunakan segera setelah tidak relevan dengan kueri lainnya.

• Restrict
|  expressions: [foo AS foo, bar AS bar]
|  records returned: 0

Perpanjang

Menambahkan sekumpulan kolom ke setiap baris dalam set hasil. Digunakan saat menambahkan kolom ke dokumen dan sebagai node perantara untuk mendukung operasi yang lebih rumit.

• Extend
|  expressions: ["bar" AS foo]
|  records returned: 1

Filter

Secara selektif menampilkan baris jika dan hanya jika baris tersebut cocok dengan ekspresi yang diberikan.

• Filter
|  expression: $eq(foo, "bar")
|  records returned: 1

Nilai

Menghasilkan urutan nilai literal untuk dikerjakan. Digunakan terutama saat 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 diberikan.

• ReplaceWith
|  map: map("full_name", str_concat(first_name, " ", last_name)), current_context())
|  records returned: 1

Lepaskan

Membatalkan penyesuaian 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 sejumlah baris yang dihasilkan oleh node turunan.

• Offset
|  offset: 10
|  records returned: 1

Lepaskan

Menghapus sekumpulan kolom tertentu dari hasil yang dihasilkan oleh node turunan.

• Drop
|  fields to drop: [__key__]
|  records returned: 1