All Products
Search
Document Center

PolarDB:Petunjuk LEADING

Last Updated:Mar 29, 2026

Urutan join default yang ditentukan oleh pengoptimal dapat menghasilkan rencana kueri suboptimal jika statistik tidak mencukupi atau selektivitas dinilai secara keliru. Petunjuk LEADING memungkinkan Anda mengganti keputusan tersebut dengan menentukan tabel mana yang harus diproses terlebih dahulu oleh pengoptimal, sementara tetap memberikan kebebasan kepada pengoptimal untuk menentukan urutan terbaik bagi tabel-tabel sisanya.

Tabel penggerak—yaitu tabel pertama dalam urutan join—memiliki dampak signifikan terhadap performa. Pilihlah tabel yang filternya mampu mengeliminasi jumlah baris paling banyak sejak awal. Semakin sedikit baris yang diteruskan ke operasi join berikutnya, semakin ringan beban kerja secara keseluruhan. Jika pengoptimal memilih tabel penggerak yang salah, gunakan petunjuk LEADING untuk memperbaikinya.

Catatan penggunaan

  • Petunjuk LEADING tidak didukung dalam pernyataan SQL bersarang. Untuk menghindari hasil yang tidak terduga, jangan gunakan petunjuk LEADING dalam klausa tersebut.

  • Ketika pengoptimal menentukan urutan join untuk beberapa tabel, tabel-tabel yang memiliki kondisi join akan diprioritaskan. Sistem hanya akan menghasilkan Produk Kartesius jika tidak ada rencana eksekusi yang dapat dibuat.

  • Jika Anda menggunakan petunjuk LEADING untuk dua tabel berdekatan yang memiliki kondisi join, tabel yang langsung mengikuti akan di-join dengan tabel sebelumnya. Jika tidak, pengoptimal akan mengabaikan petunjuk LEADING karena tidak ada rencana eksekusi yang dapat dihasilkan.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Instans PolarDB for PostgreSQL (Compatible with Oracle) dengan fitur hint diaktifkan (diaktifkan secara default)

Untuk mengaktifkan fitur hint secara manual, jalankan:

set enable_hints = true;

Sintaksis

Petunjuk mengikuti format berikut:

/*+ hint_name(parameters) */

Aturan sintaksis:

  • Mulai petunjuk dengan /*+ dan akhiri dengan */. Tidak boleh ada spasi antara * dan +.

  • Pisahkan parameter dengan spasi.

  • Letakkan petunjuk tepat setelah kata kunci DML: SELECT, UPDATE, INSERT, MERGE, atau DELETE.

  • Petunjuk tidak peka huruf besar/kecil (case-insensitive).

Kapan petunjuk LEADING diabaikan

Pengoptimal diam-diam mengabaikan petunjuk LEADING dalam situasi berikut:

SituasiHasil
Tabel yang ditentukan tidak dapat di-join dalam urutan yang diberikan karena hubungan dependensiSemua petunjuk LEADING diabaikan
Lebih dari satu petunjuk LEADING ditentukanSemua petunjuk LEADING diabaikan
Petunjuk ORDERED dan LEADING keduanya ditentukanORDERED menggantikan semua petunjuk LEADING
Nama tabel atau alias mengandung titik (.), seperti s.tSemua petunjuk LEADING diabaikan
Petunjuk tidak ditempatkan tepat setelah SELECT, UPDATE, INSERT, MERGE, atau DELETEPetunjuk LEADING diabaikan
Petunjuk LEADING digunakan di dalam pernyataan SQL bersarang atau subkueriPetunjuk LEADING diabaikan

Contoh

Contoh berikut menggunakan empat tabel — a, b, c, dan d — di mana setiap tabel dapat di-join dengan tabel lainnya.

Sintaksis valid

PetunjukUrutan join yang mungkin
/*+ leading(a) */(((a b) c) d), (((a b) d) c), (((a c) b) d), (((a c) d) b), (((a d) b) c), (((a c) c) b)
/*+ leading(a b) */(((a b) c) d), (((a b) d) c)
/*+ leading(a b c) */(((a b) c) d)
/*+ leading(a b c d) */(((a b) c) d)
Catatan Dalam notasi join, ((a b) c) berarti a dan b di-join terlebih dahulu, lalu hasilnya di-join dengan c. (c (a b)) berarti c di-join terlebih dahulu, lalu a dan b. Semakin banyak tabel yang Anda tentukan, semakin terbatas urutan join-nya. Menentukan semua tabel akan memperbaiki urutan join menjadi satu-satunya.

Sintaksis tidak valid

Contoh-contoh berikut semuanya tidak valid:

  • /* + leading(a) */ — terdapat spasi antara / dan *

  • /*+ leading(a b) leading(a b) */ — duplikat petunjuk LEADING

  • /*+ leading(a b a) */ — tabel berulang dalam daftar parameter

  • /*+ leading(a b) leading(a) */

  • /*+ leading(a b) leading(c d) */

  • /*+ leading(a b e) */ — tabel e tidak ada dalam database

  • *+ leading(a b) leading(a c) */ — tidak ada / di awal

  • /*+ leading() */ — daftar parameter kosong