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:
| Situasi | Hasil |
|---|---|
| Tabel yang ditentukan tidak dapat di-join dalam urutan yang diberikan karena hubungan dependensi | Semua petunjuk LEADING diabaikan |
| Lebih dari satu petunjuk LEADING ditentukan | Semua petunjuk LEADING diabaikan |
| Petunjuk ORDERED dan LEADING keduanya ditentukan | ORDERED menggantikan semua petunjuk LEADING |
Nama tabel atau alias mengandung titik (.), seperti s.t | Semua petunjuk LEADING diabaikan |
| Petunjuk tidak ditempatkan tepat setelah SELECT, UPDATE, INSERT, MERGE, atau DELETE | Petunjuk LEADING diabaikan |
| Petunjuk LEADING digunakan di dalam pernyataan SQL bersarang atau subkueri | Petunjuk 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
| Petunjuk | Urutan 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) |
((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) */— tabeletidak ada dalam database*+ leading(a b) leading(a c) */— tidak ada/di awal/*+ leading() */— daftar parameter kosong