All Products
Search
Document Center

Tablestore:Optimalisasi kueri

Last Updated:Jun 06, 2026

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.

Catatan

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: SELECT A,B,C FROM t WHERE A=1 AND D=2; — Jika kolom A, B, C, dan D semuanya ada dalam search index yang sama, maka search index tersebut dipilih.

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 WHERE c = 1 AND a > 1, secondary index mencocokkan 2 kolom > tabel data mencocokkan 1 kolom.

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.

Penting
  • 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);
Catatan

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;
Catatan

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 use index(index_name). Ini berguna untuk penyetelan performa atau mengganti keputusan CBO yang kurang tepat.

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

WHERE a = '123'
WHERE a = 123

Kolom a bertipe BIGINT. Ketidakcocokan tipe memicu CAST implisit.

SELECT SUM(a+b)
SELECT SUM(a)+SUM(b)

Argumen agregasi berupa ekspresi.

GROUP BY a+1
GROUP BY a

Argumen GROUP BY berupa ekspresi.

WHERE a > b

Tidak ada penulisan ulang yang setara. Lakukan filter di lapisan aplikasi.

Perbandingan kolom terhadap kolom.

ORDER BY a+1 LIMIT 10
ORDER BY a LIMIT 10

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

MatchAllQuery

=

a = 1

TermQuery

>, >=, <, <=

a > 1

RangeQuery

IS NULL / IS NOT NULL

a IS NULL

ExistsQuery

AND / OR / NOT / !=

a = 1 AND b = 2

BoolQuery

LIKE

a LIKE "%s%"

WildcardQuery

IN

a IN (1,2,3)

TermsQuery

TEXT_MATCH

TEXT_MATCH(a, "hello")

MatchQuery

TEXT_MATCH_PHRASE

TEXT_MATCH_PHRASE(a, "hello world")

MatchPhraseQuery

ARRAY_EXTRACT

ARRAY_EXTRACT(col)

Tipe data Array dan Nested

NESTED_QUERY

NESTED_QUERY(expr)

NestedQuery

ORDER BY / LIMIT

ORDER BY a LIMIT 10

Pengurutan dan paging

Fungsi agregasi / GROUP BY

SUM(col) / GROUP BY col

Agregasi