All Products
Search
Document Center

PolarDB:Leading Hint

Last Updated:Sep 15, 2026

Petunjuk LEADING mengontrol urutan join beberapa tabel, memungkinkan Anda mengganti pilihan default pengoptimal ketika pengoptimal memilih rencana eksekusi yang suboptimal.

Ketika sebuah kueri melibatkan banyak tabel, jumlah kemungkinan urutan join meningkat secara eksponensial—dan pengoptimal mungkin menghasilkan rencana yang secara semantik benar tetapi lebih lambat dari yang diharapkan. Petunjuk LEADING menginstruksikan pengoptimal untuk memulai urutan join dengan kumpulan tabel tertentu sesuai urutan yang Anda tentukan. Tabel-tabel sisanya di-join ke hasil tersebut dalam urutan apa pun yang dianggap terbaik oleh pengoptimal.

Gunakan petunjuk LEADING ketika pengoptimal secara konsisten memilih driving table yang tidak efisien—misalnya, ketika pengoptimal memulai dengan tabel besar yang tidak difilter alih-alih tabel kecil yang sangat selektif. Secara umum, tentukan tabel dengan rasio filter tertinggi sebagai driving table untuk mengurangi jumlah baris yang dibawa ke join berikutnya.

LEADING lebih fleksibel daripada ORDERED: LEADING hanya membatasi tabel-tabel awal, sehingga memberi kebebasan kepada pengoptimal untuk mengatur sisa tabel. Sebaliknya, ORDERED akan menggantikan semua petunjuk LEADING jika keduanya digunakan bersamaan.

Ketika sebuah petunjuk diabaikan, pengoptimal tidak menampilkan error—melainkan diam-diam kembali menggunakan rencananya sendiri. Jalankan EXPLAIN sebelum dan sesudah menambahkan petunjuk LEADING untuk memastikan petunjuk tersebut berlaku.

Prasyarat

Fitur hint diaktifkan secara default untuk PolarDB for PostgreSQL (Compatible with Oracle). Untuk mengaktifkannya secara manual, jalankan:

SET enable_hints = TRUE;

Sintaks

  • Blok hint dimulai dengan /*+ dan diakhiri dengan */. Tidak boleh ada spasi antara * dan +.

  • Petunjuk terdiri atas nama petunjuk diikuti parameter dalam tanda kurung, dipisahkan oleh spasi.

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

  • Petunjuk tidak peka huruf besar/kecil.

Batasan

Skenario yang tidak didukung

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

  • Saat menghasilkan urutan join, pengoptimal memprioritaskan tabel yang memiliki kondisi join. Produk Kartesius hanya dicoba jika tidak ada rencana eksekusi valid yang dapat dihasilkan.

  • Untuk dua tabel berdekatan yang memiliki kondisi join, petunjuk LEADING melakukan join tabel kedua ke tabel pertama. Jika tidak ada rencana valid dengan urutan yang ditentukan, pengoptimal akan mengabaikan petunjuk tersebut.

Kondisi yang membuat petunjuk LEADING tidak valid

KondisiPerilaku
Tabel yang ditentukan tidak dapat di-join dalam urutan yang diberikan karena hubungan dependensiPetunjuk LEADING diabaikan
Lebih dari satu petunjuk LEADING ditentukanSemua petunjuk LEADING diabaikan
Petunjuk ORDERED dan LEADING keduanya ditentukanORDERED mengganti semua petunjuk LEADING
Nama tabel atau alias yang ditentukan mengandung titik (.), seperti s.tSemua petunjuk LEADING diabaikan
Petunjuk LEADING tidak langsung mengikuti SELECT, UPDATE, INSERT, MERGE, atau DELETEPetunjuk LEADING diabaikan
Ketika petunjuk LEADING diabaikan, pengoptimal tidak melaporkan error. Jalankan EXPLAIN untuk memverifikasi apakah petunjuk tersebut berlaku dan untuk mendiagnosis pilihan rencana yang tidak sesuai harapan.

Contoh

Contoh-contoh berikut menggunakan database dengan empat tabel: a, b, c, dan d. Keempat tabel tersebut dapat di-join satu sama lain.

Sintaks yang 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)
Notasi ((a b) c) berarti a dan b di-join terlebih dahulu, lalu hasilnya di-join dengan c—sehingga prioritas join dalam urutan naik adalah a, b, c. Notasi (c (a b)) berarti a dan b di-join terlebih dahulu, lalu c di-join ke hasil tersebut—sehingga prioritas dalam urutan naik adalah c, a, b.

Sintaks yang 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 diulang dalam petunjuk yang sama

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

  • /*+ leading(a b) leading(c d) */ — beberapa petunjuk LEADING

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

  • *+ leading(a b) leading(a c) */ — tidak ada karakter pembuka /

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