Engine SQL Tablestore mengoptimalkan kueri melalui dua mekanisme: pemilihan indeks dan computation pushdown. Pemilihan indeks menentukan sumber data, sedangkan computation pushdown menentukan lokasi eksekusi komputasi.
Pemilihan indeks
Jika tabel data memiliki Secondary index atau Search index, engine SQL memilih jalur pembacaan data optimal sebelum mengeksekusi kueri. Anda dapat menggunakan pemilihan otomatis atau menentukan indeks secara manual.
Sebelum menggunakan optimalisasi kueri, pastikan Anda telah membuat pemetaan tabel data. Untuk informasi selengkapnya, lihat Operasi DDL. Untuk mempercepat kueri dengan search index, buat juga search index beserta pemetaannya.
Aturan pemilihan otomatis
Saat melakukan kueri terhadap pemetaan tabel data, engine SQL secara otomatis memilih indeks berdasarkan prioritas berikut:
|
Prioritas |
Target |
Kondisi |
|
1 |
Search index |
Semua kolom dalam klausa WHERE, agregasi, dan ORDER BY dicakup oleh search index yang sama. Contoh: |
|
2 |
Secondary index |
Secondary index mencocokkan lebih banyak kolom kunci primer awal dalam klausa WHERE dibandingkan tabel data (pencocokan prefiks paling kiri) dan mencakup semua kolom dalam kueri. Contoh: Tabel data memiliki kunci primer a dan b. Secondary index memiliki kunci primer c, a, dan b. Untuk |
|
3 |
Keputusan CBO |
Jika kedua aturan di atas tidak berlaku, engine SQL menggunakan CBO internal (Cost-Based Optimizer) untuk memilih opsi dengan biaya lebih rendah antara tabel data dan secondary index. |
Jika pemetaan dikonfigurasi dengan konsistensi kuat atau memerlukan hasil agregasi eksak, engine SQL tidak akan secara otomatis memilih search index.
Jika secondary index dan search index sama-sama mencakup semua kolom yang diperlukan, engine SQL lebih memilih search index.
Menentukan indeks secara manual
Untuk menggunakan indeks tertentu, tentukan secara manual dengan salah satu cara berikut:
Menggunakan sintaks indeks
Tentukan indeks dalam pernyataan SELECT.
-- Memaksa pemindaian tabel penuh (lewati semua indeks)
SELECT * FROM sampletable use index();
-- Menggunakan search index
SELECT * FROM sampletable use index(sampletable_search_index);
-- Menggunakan secondary index
SELECT * FROM sampletable use index(sampletable_secondary_index);
Jika indeks yang ditentukan tidak mencakup semua kolom yang diperlukan, engine SQL secara otomatis membaca data yang hilang dari tabel data.
Tabel pemetaan indeks
Lakukan kueri langsung ke tabel pemetaan secondary index atau search index.
-- Melakukan kueri melalui tabel pemetaan search index (hanya kolom dalam indeks yang dapat dikueri)
SELECT col_a, col_b FROM search_index_mapping WHERE col_a > 10;
Kueri pada tabel pemetaan indeks hanya dapat mengembalikan kolom yang termasuk dalam indeks tersebut.
Rekomendasi
|
Skenario |
Rekomendasi |
|
Agregasi, pengurutan, atau pencarian teks lengkap |
Gunakan pemilihan otomatis (default). Pastikan search index mencakup semua kolom yang diperlukan. Engine SQL secara otomatis mengarahkan kueri ke search index dan mendorong operator ke bawah (pushdown). |
|
Filter kesamaan sederhana atau rentang dengan konsistensi kuat |
Gunakan secondary index. Secondary index mendukung pembacaan konsisten kuat saat Anda memerlukan data real-time. |
|
Pemilihan otomatis menghasilkan hasil yang tidak sesuai harapan |
Tentukan indeks secara manual dengan |
|
Hanya kolom dalam indeks yang diperlukan |
Lakukan kueri langsung ke tabel pemetaan indeks untuk menghindari overhead pembacaan dari tabel data. |
Computation pushdown
Engine SQL mendorong operator tertentu ke lapisan search index untuk mengurangi volume data yang diproses di lapisan engine SQL.
Kondisi aktivasi
Computation pushdown mensyaratkan bahwa search index mencakup semua kolom dalam pernyataan SQL, termasuk kolom SELECT, WHERE, ORDER BY, dan GROUP BY. Jika ada kolom yang tidak tersedia dalam search index, engine SQL kembali ke pemindaian tabel penuh.
-- Tabel memiliki kolom a, b, c, d. Search index mencakup a, b, c.
-- d tidak ada dalam search index → pemindaian tabel penuh, tanpa pushdown
SELECT a, b, c, d FROM exampletable;
-- Semua kolom ada dalam search index → dibaca melalui search index, pushdown didukung
SELECT a, b, c FROM exampletable;
Operator yang didukung
|
Jenis operator |
Dukungan pushdown |
Kondisi |
|
Operator logika |
AND, OR |
NOT tidak dapat didorong ke bawah (pushdown). |
|
Operator relasional |
=, !=, <, <=, >, >=, BETWEEN...AND |
Hanya perbandingan kolom terhadap konstanta yang didukung. Perbandingan kolom terhadap kolom tidak dapat didorong ke bawah karena search index membangun indeks independen per kolom dan tidak dapat menyelesaikan perbandingan antar-kolom di lapisan indeks. |
|
Fungsi agregasi |
MIN, MAX, COUNT, AVG, SUM, ANY_VALUE, COUNT(DISTINCT), GROUP BY |
Argumen harus berupa nama kolom, bukan ekspresi. COUNT(*) mendukung pushdown. |
|
Pengurutan dan paginasi |
ORDER BY col LIMIT n |
Argumen ORDER BY harus berupa nama kolom. Ekspresi dalam ORDER BY tidak dapat didorong ke bawah. |
|
Fungsi vektor |
VECTOR_QUERY_FLOAT32 |
Semua ekspresi lain dalam klausa WHERE juga harus memenuhi kondisi pushdown. Jika ada ekspresi yang tidak memenuhi, kueri tidak dapat dieksekusi. |
Anti-pola umum
|
Anti-pola |
Pola yang dikoreksi |
Alasan |
|
|
Kolom a bertipe BIGINT. Ketidakcocokan tipe memicu CAST implisit. |
|
|
Argumen agregasi berupa ekspresi. |
|
|
Argumen GROUP BY berupa ekspresi. |
|
Tidak ada penulisan ulang yang setara. Lakukan filter di lapisan aplikasi. |
Perbandingan kolom terhadap kolom. |
|
|
Argumen ORDER BY berupa ekspresi. |
Pemetaan ekspresi SQL dan fitur search index
Untuk migrasi dari SDK search index ke kueri SQL, gunakan tabel berikut untuk memetakan ekspresi SQL ke fitur kueri search index.
|
Ekspresi SQL |
Contoh |
Fitur Indeks Pencarian |
|
Tidak ada klausa WHERE |
SELECT * FROM t |
|
|
= |
a = 1 |
|
|
>, >=, <, <= |
a > 1 |
|
|
IS NULL / IS NOT NULL |
a IS NULL |
|
|
AND / OR / NOT / != |
a = 1 AND b = 2 |
|
|
LIKE |
a LIKE "%s%" |
|
|
IN |
a IN (1,2,3) |
|
|
TEXT_MATCH |
TEXT_MATCH(a, "hello") |
|
|
TEXT_MATCH_PHRASE |
TEXT_MATCH_PHRASE(a, "hello world") |
|
|
ARRAY_EXTRACT |
ARRAY_EXTRACT(col) |
|
|
NESTED_QUERY |
NESTED_QUERY(expr) |
|
|
ORDER BY / LIMIT |
ORDER BY a LIMIT 10 |
|
|
Fungsi agregasi / GROUP BY |
SUM(col) / GROUP BY col |