ApsaraDB RDS for PostgreSQL menyediakan ekstensi pg_hint_plan, yang memungkinkan Anda menggunakan pernyataan komentar khusus sebagai petunjuk untuk memodifikasi rencana eksekusi PostgreSQL.
Prasyarat
Instans menjalankan RDS PostgreSQL 10 atau yang lebih baru.
CatatanJika Anda tidak dapat membuat ekstensi, tingkatkan versi mesin minor terlebih dahulu. Sebagai contoh, untuk instans RDS PostgreSQL 17, versi mesin minor harus 20241030 atau yang lebih baru.
Anda telah membuat akun istimewa untuk instans RDS PostgreSQL. Untuk informasi lebih lanjut, lihat Buat akun.
Informasi latar belakang
PostgreSQL menggunakan pengoptimal berbasis biaya yang memanfaatkan statistik data daripada aturan statis. Untuk sebuah Pernyataan SQL, pengoptimal mengevaluasi biaya dari setiap rencana eksekusi yang mungkin dan memilih yang memiliki biaya paling rendah. Pengoptimal mencoba memilih rencana eksekusi terbaik, tetapi karena tidak memahami beberapa hubungan inheren yang mungkin ada dalam data, rencana eksekusi ini mungkin tidak sempurna. Anda dapat menggunakan ekstensi pg_hint_plan untuk menambahkan petunjuk ke pernyataan SQL. Petunjuk tersebut menentukan bagaimana Anda ingin mengeksekusi pernyataan SQL. Dengan cara ini, Anda dapat mengoptimalkan rencana eksekusi dari pernyataan SQL.
Instal dan uninstall ekstensi
Kelola ekstensi di Konsol
Instal Ekstensi
Kunjungi daftar instans RDS, pilih Wilayah di bilah navigasi atas, lalu klik ID instans target.
Di panel navigasi sisi kiri, klik Plug-ins.
Di halaman Manage Plug-ins, klik tab Not Installed, cari ekstensi pg_hint_plan, dan klik kolom Operation pada tombol Install.

Dalam kotak dialog yang muncul, pilih database target dan akun istimewa, lalu klik Install untuk menginstal ekstensi ke database target.
Saat status instans berubah dari Maintaining Instance menjadi Running, ekstensi berhasil diinstal.
Perbarui dan Uninstall Ekstensi
Di halaman Manage Plug-ins, klik tab Installed, dan klik kolom Operation pada tombol Upgrade Version untuk memperbarui ekstensi target ke versi terbaru.
Catatan
Jika kolom Operation tidak memiliki tombol Upgrade Version, ekstensi sudah merupakan versi terbaru.
Di halaman Manage Plug-ins, klik tab Installed, dan klik kolom Operation pada tombol Uninstall untuk menghapus ekstensi target.
Kelola ekstensi menggunakan perintah SQL
Atur parameter instans, dan tambahkan pg_hint_plan ke Running Value dari shared_preload_libraries. Sebagai contoh, ubah Running Value menjadi
'pg_stat_statements,auto_explain,pg_hint_plan'.Gunakan akun istimewa untuk terhubung ke database tempat Anda ingin menginstal ekstensi, dan jalankan pernyataan SQL berikut untuk mengelola ekstensi.
Instal Ekstensi
CREATE EXTENSION pg_hint_plan;Uninstall Ekstensi
DROP EXTENSION pg_hint_plan;
Petunjuk komentar
Petunjuk komentar pg_hint_plan dimulai dengan /*+ dan diakhiri dengan */.
Sebuah pernyataan petunjuk terdiri dari nama petunjuk dan parameternya dalam tanda kurung, dengan parameter dipisahkan oleh spasi. Untuk keterbacaan yang lebih baik, setiap pernyataan petunjuk dapat dimulai pada baris baru.
Dalam kueri SQL, jika alias digunakan untuk nama tabel, alias yang sama juga harus digunakan dalam pernyataan petunjuk pg_hint_plan.
Tabel petunjuk
Petunjuk dapat digunakan untuk mengoptimalkan rencana eksekusi pernyataan SQL. Namun, ini hanya nyaman ketika pernyataan SQL dapat diedit. Jika pernyataan SQL tidak dapat diedit, Anda dapat menempatkan petunjuk dalam tabel bernama hint_plan.hints. Tabel hint_plan.hints berisi kolom-kolom yang dijelaskan dalam tabel berikut.
Secara default, pengguna yang membuat ekstensi pg_hint_plan memiliki izin pada tabel hint_plan.hints. Petunjuk dalam tabel hint_plan.hints memiliki prioritas lebih tinggi daripada petunjuk yang Anda tambahkan menggunakan ekstensi pg_hint_plan.
Kolom | Deskripsi |
id | ID petunjuk. ID ini unik dan dibuat secara otomatis. |
norm_query_string | Pola yang cocok dengan pernyataan SQL tempat Anda ingin menambahkan petunjuk. Konstanta dalam kueri harus diganti dengan |
application_name | Nama aplikasi tempat petunjuk diterapkan. Jika parameter ini dibiarkan kosong, petunjuk diterapkan ke semua aplikasi. |
hints | Komentar yang berisi petunjuk. Anda tidak perlu menyertakan tanda komentar. |
Aktifkan tabel petunjuk
SET pg_hint_plan.enable_hint_table = on;Masukkan data ke dalam tabel petunjuk
INSERT INTO hint_plan.hints (norm_query_string, application_name, hints)
VALUES (
'EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = ?;',
'',
'SeqScan(t1)'
);Perbarui data dalam tabel petunjuk
UPDATE hint_plan.hints
SET hints = 'IndexScan(t1)'
WHERE id = 1;Hapus data dari tabel petunjuk
DELETE FROM hint_plan.hints
WHERE id = 1;Jenis petunjuk
Berdasarkan bagaimana frasa petunjuk memengaruhi rencana eksekusi, mereka dapat dikategorikan ke dalam enam jenis berikut:
Petunjuk untuk Metode Pemindaian
Jenis petunjuk ini menentukan metode yang digunakan untuk memindai tabel yang ditentukan. Jika tabel yang ditentukan memiliki alias, ekstensi pg_hint_plan mengidentifikasi tabel berdasarkan alias. Metode pemindaian termasuk
SeqScan,IndexScan,NoSeqScan, dan lainnya.Petunjuk untuk metode pemindaian valid pada tabel biasa, tabel warisan, tabel tanpa log, tabel sementara, dan tabel sistem. Petunjuk untuk metode pemindaian tidak valid pada tabel eksternal, fungsi tabel, pernyataan di mana nilai konstan ditentukan, ekspresi universal, tampilan, dan subkueri.
Petunjuk untuk Metode Join
Jenis petunjuk ini menentukan metode yang digunakan untuk menggabungkan tabel yang ditentukan.
Petunjuk untuk metode join valid pada tabel biasa, tabel warisan, tabel tanpa log, tabel sementara, tabel eksternal, tabel sistem, fungsi tabel, pernyataan di mana nilai konstan ditentukan, dan ekspresi universal. Petunjuk untuk metode join tidak valid pada tampilan dan subkueri.
Petunjuk untuk Urutan Join
Jenis petunjuk ini menentukan urutan di mana dua atau lebih tabel digabungkan. Anda dapat menggunakan salah satu dari metode berikut untuk menentukan petunjuk yang menentukan urutan join:
Tentukan urutan di mana Anda ingin menggabungkan tabel yang ditentukan tanpa perlu membatasi arah di setiap level join.
Tentukan urutan di mana Anda ingin menggabungkan tabel yang ditentukan dan arah di setiap level join.
Petunjuk untuk Koreksi Jumlah Baris
Jenis petunjuk ini mengoreksi kesalahan jumlah baris yang disebabkan oleh pengoptimal.
Petunjuk untuk Eksekusi Paralel
Jenis petunjuk ini menentukan rencana yang digunakan untuk mengeksekusi pernyataan SQL secara paralel.
Petunjuk untuk eksekusi paralel valid pada tabel biasa, tabel warisan, tabel tanpa log, dan tabel sistem. Petunjuk untuk eksekusi paralel tidak valid pada tabel eksternal, klausa di mana nilai konstan ditentukan, ekspresi universal, tampilan, dan subkueri. Anda dapat menentukan tabel internal dari tampilan berdasarkan nama asli atau alias mereka.
Contoh berikut menunjukkan bagaimana pernyataan SQL dieksekusi dengan cara yang berbeda pada setiap tabel:
Petunjuk untuk Pengaturan Parameter GUC
Jenis petunjuk ini sementara mengubah nilai parameter GUC. Nilai parameter GUC dalam rencana eksekusi membantu Anda mencapai efek yang Anda harapkan. Namun, ini tidak berlaku jika petunjuk yang ditentukan bertentangan dengan rencana eksekusi pernyataan SQL lainnya. Jika Anda mengonfigurasi parameter GUC lebih dari satu kali, nilai terbaru yang diatur akan berlaku.
Format petunjuk yang didukung
Kategori | Format | Deskripsi |
Petunjuk untuk metode pemindaian | SeqScan(table) | Memaksa pemindaian berurutan pada tabel. |
TidScan(table) | Memaksa pemindaian identifier tupel (TID) pada tabel. | |
IndexScan(table[ index...]) | Menentukan pemindaian indeks. Anda dapat menentukan indeks. | |
IndexOnlyScan(table[ index...]) | Menentukan pemindaian indeks saja. Anda dapat menentukan indeks. | |
BitmapScan(table[ index...]) | Menentukan pemindaian bitmap. | |
NoSeqScan(table) | Melarang pemindaian berurutan. | |
NoTidScan(table) | Melarang pemindaian TID. | |
NoIndexScan(table) | Melarang pemindaian indeks. | |
NoIndexOnlyScan(table) | Melarang pemindaian indeks. Hanya tabel yang dipindai. | |
NoBitmapScan(table) | Melarang pemindaian bitmap. | |
Petunjuk untuk metode join | NestLoop(table table[ table...]) | Menentukan nested loop join. |
HashJoin(table table[ table...]) | Menentukan hash join. | |
MergeJoin(table table[ table...]) | Menentukan merge join. | |
NoNestLoop(table table[ table...]) | Melarang nested loop join. | |
NoHashJoin(table table[ table...]) | Melarang hash join. | |
NoMergeJoin(table table[ table...]) | Melarang merge join. | |
Petunjuk untuk urutan join | Leading(table table[ table...]) | Menentukan urutan join. |
Leading(<pasangan join>) | Menentukan urutan dan arah join. | |
Petunjuk untuk koreksi jumlah baris | Rows(table table[ table...] koreksi) | Mengoreksi jumlah baris hasil join yang diperoleh dari tabel yang ditentukan. Metode koreksi yang tersedia termasuk nilai absolut |
Petunjuk untuk eksekusi paralel | Parallel(table <# pekerja> [soft|hard]) | Menentukan atau melarang eksekusi paralel tabel yang ditentukan. Jika Anda mengatur parameter ketiga ke soft, hanya nilai parameter max_parallel_workers_per_gather yang diubah dan parameter lainnya ditentukan oleh pengoptimal. Jika Anda mengatur parameter ketiga ke hard, nilai semua parameter terkait diubah. Nilai default parameter ketiga adalah soft. |
Petunjuk untuk pengaturan parameter GUC | Set(GUC-param value) | Menentukan nilai parameter GUC saat pengoptimal berjalan. |
Untuk informasi lebih lanjut, lihat pg_hint_plan.