OPT_PARAM adalah petunjuk kueri untuk PolarDB for PostgreSQL (Compatible with Oracle) yang mengganti parameter pengoptimal pada tingkat pernyataan SQL individual. Berbeda dengan pengaturan parameter di tingkat database, sesi, atau pengguna, nilai yang ditetapkan melalui OPT_PARAM hanya berlaku untuk pernyataan yang memuat petunjuk tersebut.
Gunakan OPT_PARAM ketika kueri tertentu berkinerja buruk akibat rencana eksekusi yang suboptimal dan Anda perlu menguji strategi rencana berbeda tanpa mengubah konfigurasi global atau sesi.
Parameter enable_* yang dikendalikan oleh OPT_PARAM merupakan cara cepat untuk memengaruhi rencana kueri, bukan solusi penyetelan jangka panjang. Jika suatu kueri secara konsisten menghasilkan rencana yang buruk, selidiki penyebab utamanya, seperti statistik yang kedaluwarsa (jalankan ANALYZE), konstanta biaya yang tidak akurat, atau target statistik per kolom yang tidak mencukupi.
Sintaksis
SELECT /*+ opt_param("parameter_name" "value") */ ...;
Beberapa petunjuk dapat digabungkan dalam satu blok komentar:
SELECT /*+ opt_param("enable_hashjoin" "off"),
opt_param("enable_mergejoin" "off") */ ...;
Parameter yang didukung
Semua parameter menerima nilai "on" atau "off".
Metode Pemindaian
| Parameter | Deskripsi |
|---|
enable_bitmapscan | Mengontrol apakah perencana kueri mempertimbangkan rencana pemindaian bitmap. |
enable_indexscan | Mengontrol apakah perencana kueri mempertimbangkan rencana pemindaian indeks. |
enable_indexonlyscan | Mengontrol apakah perencana kueri mempertimbangkan rencana pemindaian hanya-indeks (index-only scan). |
enable_seqscan | Mengontrol apakah perencana kueri mempertimbangkan rencana Pemindaian berurutan. Pemindaian berurutan tidak dapat dinonaktifkan sepenuhnya; menetapkan nilai ini ke off mencegah perencana menggunakan metode tersebut selama opsi lain tersedia. |
enable_tidscan | Mengontrol apakah perencana kueri mempertimbangkan rencana pemindaian TID. |
Metode Join
| Parameter | Deskripsi |
|---|
enable_hashjoin | Mengontrol apakah perencana kueri mempertimbangkan rencana hash join. |
enable_mergejoin | Mengontrol apakah perencana kueri mempertimbangkan rencana merge join. |
enable_nestloop | Mengontrol apakah perencana kueri mempertimbangkan rencana nested loop join. Nested loop join tidak dapat dinonaktifkan sepenuhnya; mengatur nilai ini ke off mencegah perencana menggunakannya ketika metode join lain tersedia. |
Agregasi
| Parameter | Deskripsi |
|---|
enable_hashagg | Mengontrol apakah perencana kueri mempertimbangkan rencana agregasi hash. |
Pengurutan dan materialisasi
| Parameter | Deskripsi |
|---|
enable_sort | Mengontrol apakah perencana kueri menggunakan langkah pengurutan eksplisit. Langkah pengurutan eksplisit tidak dapat dinonaktifkan sepenuhnya; mengatur nilai ini ke off mencegah perencana menggunakan langkah tersebut jika strategi pengurutan lain tersedia. |
enable_material | Mengontrol apakah perencana kueri menyisipkan node materialisasi. Materialisasi tidak dapat dinonaktifkan sepenuhnya; menyetel ini ke off mencegah perencana menyisipkan node materialisasi. |
Kueri paralel
| Parameter | Deskripsi |
|---|
enable_gathermerge | Mengontrol apakah perencana kueri mempertimbangkan rencana gather merge. |
enable_parallel_append | Mengontrol apakah perencana kueri mempertimbangkan rencana parallel append. |
enable_parallel_hash | Mengontrol apakah perencana kueri menggunakan parallel hash untuk rencana hash join. Tidak berpengaruh jika enable_hashjoin bernilai off. |
Optimasi partisi
| Parameter | Deskripsi |
|---|
enable_partition_pruning | Mengontrol apakah perencana kueri mengeliminasi partisi dari rencana kueri dan apakah pelaksana kueri menghapus (mengabaikan) partisi pada waktu proses. |
enable_partitionwise_aggregate | Mengontrol apakah perencana kueri melakukan pengelompokan atau agregasi secara terpisah untuk setiap partisi. Jika klausa GROUP BY tidak mencakup semua kunci partisi, hanya agregasi parsial yang dijalankan per partisi dan finalisasi dilakukan setelahnya. |
enable_partitionwise_join | Mengontrol apakah perencana kueri melakukan join antara tabel terpartisi dengan menggabungkan partisi yang sesuai. Hanya berlaku jika kondisi join mencakup semua kunci partisi, kunci partisi memiliki tipe data yang sama, dan partisi anak memiliki korespondensi satu-ke-satu. |
Contoh
Nonaktifkan pemindaian bitmap untuk satu kueri
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_bitmapscan" "off") */ * FROM sampletable WHERE x < 423;
Nonaktifkan merge join untuk kueri join
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_mergejoin" "off") */ tt1.*, tt2.* FROM tt1 JOIN tt2 ON tt1.joincol = tt2.joincol;
Aktifkan hash join untuk kueri join
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_hashjoin" "on") */ tt1.*, tt2.* FROM tt1 JOIN tt2 ON tt1.joincol = tt2.joincol;
Gabungkan beberapa petunjuk
Nonaktifkan hash join dan merge join dalam satu pernyataan:
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_hashjoin" "off"),
opt_param("enable_mergejoin" "off") */ tt1.*, tt2.* FROM tt1 JOIN tt2 ON tt1.joincol = tt2.joincol;