全部产品
Search
文档中心

AnalyticDB:Gunakan fitur hint

更新时间:Dec 10, 2025

Ekstensi pg_hint_plan dari AnalyticDB for PostgreSQL menyediakan fitur hint, yang memungkinkan Anda memodifikasi dan mengoptimalkan rencana eksekusi untuk meningkatkan performa eksekusi SQL.

Batasan

  • Untuk instance AnalyticDB for PostgreSQL yang menjalankan versi V6.3.8.1 atau lebih baru, fitur hint diaktifkan setelah Anda memasang ekstensi pg_hint_plan.

  • Sebelum memasang ekstensi pg_hint_plan, disarankan untuk memperbarui versi mesin minor instance ke V6.3.8.1 atau lebih baru.

  • Untuk memasang atau meningkatkan ekstensi pada instance yang menjalankan V6.3.8.9 atau lebih baru, Submit a ticket.

    Untuk informasi lebih lanjut tentang cara melihat dan memperbarui versi mesin minor instance, lihat Lihat Versi Mesin Minor dan Perbarui Versi Mesin Minor.

Ikhtisar

AnalyticDB for PostgreSQL menggunakan Optimalisasi berbasis biaya yang memanfaatkan statistik data alih-alih aturan statis. Optimizer memperkirakan biaya setiap rencana eksekusi yang mungkin untuk Pernyataan SQL dan memilih rencana dengan biaya minimum untuk dieksekusi. Meskipun optimizer melakukan yang terbaik untuk memilih rencana eksekusi optimal, rencana akhir mungkin tetap tidak sesuai untuk skenario tertentu karena keterbatasan dalam memprediksi korelasi antara data.

Ekstensi pg_hint_plan dapat menggunakan hint untuk memodifikasi dan mengoptimalkan rencana eksekusi SQL serta mendaftarkan pola SQL yang dioptimalkan dan aturan hint. Dengan cara ini, rencana eksekusi yang dioptimalkan dapat dibuat secara otomatis ketika pernyataan SQL dengan pola SQL terdaftar yang sama dijalankan, meningkatkan efisiensi eksekusi.

Aktifkan fitur hint

Jalankan pernyataan berikut untuk memasang ekstensi pg_hint_plan guna mengaktifkan fitur hint:

CREATE EXTENSION pg_hint_plan;
Catatan

Fitur hint hanya dapat digunakan untuk database yang memiliki ekstensi pg_hint_plan terpasang.

Hint yang didukung

Kategori

Format

Deskripsi

Hint untuk pengaturan parameter GUC (Grand Unified Configuration)

Set(GUC-param value)

Mengatur parameter GUC saat optimizer berjalan.

Parameter GUC hanya berlaku saat optimizer berjalan dan tidak pada fase lain seperti rewrite dan execute.

  • Untuk menonaktifkan optimizer ORCA untuk sebuah pernyataan, kami menyarankan Anda menambahkan SET(optimizer off) ke dalam pernyataan tersebut.

  • Untuk mengaktifkan optimizer ORCA untuk sebuah pernyataan, kami menyarankan Anda menambahkan SET(<ORCA parameter><value>) ke dalam pernyataan tersebut.

Hint untuk metode scan

SeqScan(table)

Memaksa sequential scans pada tabel.

TidScan(table)

Memaksa tuple identifier (TID) scans pada tabel.

IndexScan(table[ index...])

Memaksa index scans pada tabel. Anda dapat menentukan indeks.

IndexOnlyScan(table[ index...])

Memaksa index-only scans pada tabel. Anda dapat menentukan indeks.

BitmapScan(table[ index...])

Memaksa bitmap index scans pada tabel.

NoSeqScan(table)

Melarang sequential scans pada tabel.

NoTidScan(table)

Melarang TID scans pada tabel.

NoIndexScan(table)

Melarang index scans pada tabel.

NoIndexOnlyScan(table)

Melarang index-only scans pada tabel.

NoBitmapScan(table)

Melarang bitmap index scans pada tabel.

Hint untuk metode join

Catatan

Hint untuk metode join harus digunakan bersamaan dengan hints for join order.

NestLoop(table table[ table...])

Memaksa nested loops untuk join yang terdiri dari tabel-tabel yang ditentukan.

HashJoin(table table[ table...])

Memaksa hash joins untuk join yang terdiri dari tabel-tabel yang ditentukan.

MergeJoin(table table[ table...])

Memaksa merge joins untuk join yang terdiri dari tabel-tabel yang ditentukan.

NoNestLoop(table table[ table...])

Melarang nested loops untuk join yang terdiri dari tabel-tabel yang ditentukan.

NoHashJoin(table table[ table...])

Melarang hash joins untuk join yang terdiri dari tabel-tabel yang ditentukan.

NoMergeJoin(table table[ table...])

Melarang merge joins untuk join yang terdiri dari tabel-tabel yang ditentukan.

Hint untuk urutan join

Leading(table table[ table...])

Memaksa urutan join seperti yang ditentukan.

Leading(<join pair>)

Memaksa urutan join dan arah seperti yang ditentukan.

Hint untuk koreksi jumlah baris

Rows(table table[ table...] correction)

Mengoreksi jumlah baris hasil dari join yang terdiri dari tabel-tabel yang ditentukan.

Metode koreksi yang tersedia adalah nilai absolut #<n>, penambahan + <n>, pengurangan - <n>, dan perkalian * <n>.

<n> adalah string yang dapat dibaca oleh strtod().

Catatan

Hint Rows mengoreksi jumlah total baris, sedangkan hasil query menunjukkan jumlah rata-rata baris per node (jumlah total baris/jumlah node).

Catatan
  • Hint selain pengaturan parameter GUC hanya berlaku untuk optimizer query PostgreSQL, bukan optimizer ORCA.

  • Hint tidak dapat digunakan untuk memodifikasi derajat paralelisme (DOP).

Contoh:

  • Hint untuk Pengaturan Parameter GUC

    Pengaturan parameter GUC yang dilakukan saat optimizer berjalan berlaku baik untuk optimizer ORCA maupun query.

    • Nonaktifkan optimizer ORCA.

      /*+ SET(optimizer off) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;

      Setelah optimizer ORCA dinonaktifkan, optimizer tersebut tidak digunakan.

    • Aktifkan optimizer ORCA.

      /*+ SET(optimizer on) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;

      Setelah optimizer ORCA diaktifkan, optimizer tersebut digunakan dalam banyak kasus, kecuali dalam skenario tertentu seperti query pada tabel tunggal atau tabel partisi berlebihan.

    • Paksa aktifkan optimizer ORCA.

      /*+ SET(optimizer on) SET(rds_optimizer_options 0) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;

      Setelah optimizer ORCA dipaksa aktifkan, optimizer tersebut selalu digunakan, kecuali jika tidak dapat membuat rencana.

    • Paksa aktifkan optimizer ORCA dan nonaktifkan HashJoin optimizer ORCA.

      /*+ SET(optimizer on) SET(rds_optimizer_options 0) SET(optimizer_enable_hashjoin off) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
  • Hint untuk Metode Scan

    Hint untuk metode scan hanya berlaku untuk optimizer query. Jalankan pernyataan berikut untuk menonaktifkan optimizer ORCA:

    SET optimizer to off;
    • Paksa index scans pada tabel t1.

      /*+ Indexscan(t1) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Larang index scans pada tabel t1.

      /*+ NoIndexscan(t1) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Paksa bitmap index scans pada tabel t1 menggunakan indeks bitmap t1_val.

      /*+ Bitmapscan(t1 t1_val) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Paksa index-only scans pada tabel t1.

      /*+ Indexonlyscan(t1) */EXPLAIN SELECT t2.*, t1.val FROM t1 JOIN t2 ON t1.val = t2.val;
      Catatan

      Index-only scans hanya dapat digunakan pada kolom-kolom index-only.

    • Paksa TID scans pada tabel t1.

      /*+ Tidscan(t1) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val where t1.ctid = '(1,2)';
      Catatan

      TID scans hanya dapat digunakan pada tabel yang mengandung kondisi TID.

  • Hint untuk Metode Join dan Urutan Join

    Hint untuk metode join cocok hanya untuk optimizer query. Jalankan pernyataan berikut untuk menonaktifkan optimizer ORCA:

    SET optimizer to off;
    • Paksa merge joins ketika tabel t1 adalah tabel kiri.

      /*+ Leading((t1 t2)) MergeJoin(t1 t2) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Paksa nested loop joins ketika tabel t1 adalah tabel kiri.

      /*+ Leading((t1 t2)) NestLoop(t1 t2) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Larang hash joins ketika tabel t1 adalah tabel kiri.

      /*+ Leading((t1 t2)) NoHashJoin(t1 t2) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Paksa hash joins untuk t2 dan t3 lalu paksa nest loop joins dengan t1.

      /*+ Leading(((t2 t3) t1)) HashJoin(t2 t3) NestLoop(t2 t3 t1) */EXPLAIN SELECT * FROM t1, t2, t3 WHERE t1.val = t2.val and t2.val = t3.val;
  • Hint untuk Koreksi Jumlah Baris

    Hint untuk koreksi jumlah baris cocok hanya untuk optimizer query. Jalankan pernyataan berikut untuk menonaktifkan optimizer ORCA:

    SET optimizer to off;
    • Tingkatkan jumlah total baris sebanyak 100 kali lipat pada tabel yang diperoleh dengan menggabungkan t1 dan t2.

      /*+ Rows(t1 t2 *100) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Kurangi jumlah total baris sebanyak 100 kali lipat pada tabel yang diperoleh dengan menggabungkan t1 dan t2.

      /*+ Rows(t1 t2 *0.01) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Tambahkan 100 ke jumlah total baris pada tabel yang diperoleh dengan menggabungkan t1 dan t2.

      /*+ Rows(t1 t2 +100) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Kurangi 100 dari jumlah total baris pada tabel yang diperoleh dengan menggabungkan t1 dan t2.

      /*+ Rows(t1 t2 -100) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • Koreksi jumlah total baris menjadi 100 pada tabel yang diperoleh dengan menggabungkan t1 dan t2.

      /*+ Rows(t1 t2 #100) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;

Parameter GUC

Parameter

Nilai default

Deskripsi

pg_hint_plan.enable_hint

on

Menentukan apakah akan mengaktifkan fitur hint untuk memodifikasi rencana eksekusi. Nilai valid:

  • on

  • off

pg_hint_plan.enable_hint_table

off

Menentukan apakah akan mengaktifkan fitur pendaftaran hint. Nilai valid:

  • on

  • off

pg_hint_plan.jumble_mode

off

Menentukan apakah akan menggunakan pengenal objek (OID) untuk mengidentifikasi objek dalam pernyataan SQL berparameter, seperti tabel, fungsi, dan operator. Nilai valid:

  • on: menggunakan OID untuk mengidentifikasi objek. Setelah objek dihapus, objek lain yang dibuat dengan nama yang sama dengan objek yang dihapus dianggap sebagai objek yang berbeda.

  • off: menggunakan skema dan nama objek untuk mengidentifikasi objek. Objek dengan nama yang sama dalam skema yang sama dianggap sebagai objek yang sama.

Catatan

Kami menyarankan Anda untuk tidak sering mengubah parameter ini. Jika Anda mengubah parameter ini, hint yang terdaftar sebelumnya tidak dapat digunakan.

pg_hint_plan.parse_messages

info

Tingkat log kesalahan parse hint. Nilai valid:

error, warning, notice, info, log, dan debug[1-5].

pg_hint_plan.message_level

log

Tingkat log kesalahan dalam fase selain parse hint. Nilai valid:

error, warning, notice, info, log, dan debug[1-5].

Daftarkan hint

Jika Anda ingin hint diterapkan secara otomatis pada pernyataan SQL yang menggunakan pola SQL yang sama atau jika hint tidak dapat ditambahkan ke pernyataan SQL, Anda dapat mendaftarkan hint dengan menambahkannya ke tabel sistem hint_plan.hints. Setelah hint didaftarkan, rencana eksekusi yang dioptimalkan dengan hint dibuat secara otomatis ketika pernyataan SQL dengan pola SQL yang sama dijalankan.

Tabel berikut menjelaskan kolom dalam tabel hint_plan.hints.

Kolom

Tipe

Deskripsi

id

integer

Nomor unik yang mengidentifikasi hint. Kolom ini diisi secara otomatis oleh urutan.

norm_query_string

text

Pola SQL tempat hint berlaku. Pola SQL adalah pernyataan SQL yang tidak mengandung parameter atau konstanta.

application_name

text

Aplikasi yang terdaftar dengan hint. Nilai defaultnya adalah string kosong (''), yang menunjukkan bahwa hint berlaku untuk semua aplikasi. Dalam contoh-contoh berikut, nilai kolom ini adalah string kosong ('').

Kolom application_name memiliki batasan UNIQUE.

hints

text

Hint yang akan didaftarkan.

Kolom hints memiliki batasan UNIQUE.

query_hash

bigint

Nilai hash dari pola SQL berparameter, yang merupakan pengenal unik dari pernyataan SQL standar.

Kolom query_hash memiliki batasan UNIQUE.

enable

boolean

Menentukan apakah akan mengaktifkan hint. Anda hanya dapat menerapkan satu hint pada pola SQL.

prepare_param_strings

text

Parameter yang direkam jika pernyataan PREPARE digunakan.

Catatan

Anda dapat meminta tabel hint_plan.hints, namun kami menyarankan untuk tidak memodifikasinya secara langsung. Modifikasi tabel disarankan melalui fungsi modifikasi.

Berikut ini menjelaskan fungsi yang digunakan untuk pendaftaran hint.

  • Fungsi untuk Mendapatkan Parameter Pernyataan SQL

    hint_plan.gp_hint_query_parameterize(<query>, <application_name>)

    Parameter

    Deskripsi

    query

    Pernyataan SQL yang mengandung hint.

    application_name

    Aplikasi yang terdaftar dengan hint. Nilainya adalah string kosong ('').

    Fungsi ini digunakan untuk mendapatkan parameter dari pernyataan SQL yang mengandung hint. Tabel berikut menjelaskan parameter yang dapat diperoleh.

    Parameter

    Deskripsi

    query_hash

    Nilai hash dari pola SQL berparameter, yang merupakan pengenal unik dari pernyataan SQL standar.

    norm_query_string

    Pola SQL.

    comment_hints

    Hint.

    first_matched_hint_in_table

    Hint dalam tabel hint_plan.hints yang cocok dengan pola SQL.

    prepare_param_strings

    Parameter dalam pernyataan SQL.

    Contoh:

    SELECT * FROM hint_plan.gp_hint_query_parameterize('/*+ MergeJoin(t1 t2) Leading((t1 t2)) */SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < 100 and t2.val > 20;');

    Informasi berikut dikembalikan:

    -[ RECORD 1 ]---------------+--------------------------------------------------------------------------
    query_hash                  | -4733464863014584191
    norm_query_string           | SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2;
    comment_hints               | MergeJoin(t1 t2) Leading((t1 t2))
    first_matched_hint_in_table | HashJoin(t1 t2) Leading((t1 t2))
    prepare_param_strings       | {}
  • Fungsi yang digunakan untuk mendaftarkan hint.

    hint_plan.insert_hint_table(<query>, <application_name>)

    Parameter

    Deskripsi

    query

    Pernyataan SQL yang mengandung hint.

    application_name

    Aplikasi yang terdaftar dengan hint. Nilainya adalah string kosong ('').

    Fungsi ini dapat digunakan untuk mendaftarkan hint yang berbeda untuk pola SQL yang sama. Saat Anda menyisipkan hint dengan pola SQL yang sama, nama hint yang sama, dan nama aplikasi yang sama, tidak ada hint baru yang ditambahkan ke tabel hint_plan.hints. Hint yang disisipkan diaktifkan sementara hint yang ada dinonaktifkan.

    Contoh:

    SELECT hint_plan.insert_hint_table('/*+ MergeJoin(t1 t2) Leading((t1 t2)) */SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < 100 and t2.val > 1;');

    Informasi berikut dikembalikan:

                                                                     insert_hint_table
    ---------------------------------------------------------------------------------------------------------------------------------------------------
     (1,"SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2;","","MergeJoin(t1 t2) Leading((t1 t2)) ",-4733464863014584191,t,{})
    (1 row)
  • Fungsi untuk Memodifikasi Hint

    hint_plan.upsert_hint_table(<query>, <application_name>)

    Parameter

    Deskripsi

    query

    Pernyataan SQL yang mengandung hint.

    application_name

    Aplikasi yang terdaftar dengan hint. Nilainya adalah string kosong ('').

    Jika pola SQL yang digunakan oleh pernyataan SQL mengandung hint, hint yang ada dalam tabel hint_plan.hints diganti dengan hint yang terkandung dalam pernyataan SQL yang ditentukan oleh query. Jika pola SQL tidak mengandung hint, hint baru didaftarkan.

    Contoh:

    1. Minta hint yang ada dalam tabel hint_plan.hints.

      SELECT * FROM hint_plan.hints;

      Informasi berikut dikembalikan:

       id |                             norm_query_string                             | application_name |               hints                |      query_hash      | enable | prepare_param_strings
      ----+---------------------------------------------------------------------------+------------------+------------------------------------+----------------------+--------+-----------------------
        1 | SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2; |                  | MergeJoin(t1 t2) Leading((t1 t2))  | -4733464863014584191 | f      | {}
        2 | SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2; |                  | Nestloop(t1 t2) Leading((t1 t2))   | -4733464863014584191 | t      | {}
      (2 rows)
    2. Panggil fungsi untuk memodifikasi hint.

      SELECT hint_plan.upsert_hint_table('/*+ HashJoin(t1 t2) Leading((t1 t2)) */SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < 100 and t2.val > 1;');

      Informasi berikut dikembalikan:

                                                                      upsert_hint_table
      --------------------------------------------------------------------------------------------------------------------------------------------------
       (2,"SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2;","","HashJoin(t1 t2) Leading((t1 t2)) ",-4733464863014584191,t,{})
      (1 row)
    3. Minta hint yang dimodifikasi dalam tabel hint_plan.hints.

      SELECT * FROM hint_plan.hints;

      Hint dari pola SQL berubah dari Nestloop(t1 t2) Leading((t1 t2)) menjadi HashJoin(t1 t2) Leading((t1 t2)). Informasi berikut dikembalikan:

       id |                             norm_query_string                             | application_name |               hints                |      query_hash      | enable | prepare_param_strings
      ----+---------------------------------------------------------------------------+------------------+------------------------------------+----------------------+--------+-----------------------
        1 | SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2; |                  | MergeJoin(t1 t2) Leading((t1 t2))  | -4733464863014584191 | f      | {}
        2 | SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2; |                  | HashJoin(t1 t2) Leading((t1 t2))   | -4733464863014584191 | t      | {}
      (2 rows)
  • Fungsi untuk Menghapus Hint

    • Hapus hint dengan ID tertentu.

      hint_plan.delete_hint_table(<id>)
    • Hapus hint yang didefinisikan oleh pernyataan SQL tertentu, nama hint, dan nama aplikasi.

      hint_plan.delete_hint_table(<query>, <hint>, <application_name>)
    • Hapus hint yang didefinisikan oleh pernyataan SQL tertentu dan nama aplikasi.

      hint_plan.delete_all_hint_table(<query>, <application_name>)

    Parameter

    Deskripsi

    id

    ID hint dalam tabel hint_plan.hints.

    query

    Pernyataan SQL yang mungkin atau mungkin tidak mengandung hint.

    hint

    Hint.

    application_name

    Aplikasi yang terdaftar dengan hint. Nilainya adalah string kosong ('').

    Contoh:

    Minta tabel hint_plan.hints asli.

    SELECT * FROM hint_plan.hints;

    Informasi berikut dikembalikan:

     id |                             norm_query_string                             | application_name |                      hints                      |      query_hash      | enable | prepare_param_strings
    ----+---------------------------------------------------------------------------+------------------+-------------------------------------------------+----------------------+--------+-----------------------
      1 | SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2; |                  | MergeJoin(t1 t2) Leading((t1 t2))               | -4733464863014584191 | f      | {}
      2 | SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2; |                  | HashJoin(t1 t2) Leading((t1 t2))                | -4733464863014584191 | t      | {}
      3 | select * from t1 join t2 on t1.val = t2.val;                              |                  | set(optimizer on) set(rds_optimizer_options 0)  | -2169095602568752481 | f      | {}
      4 | select * from t1 join t2 on t1.val = t2.val;                              |                  | set(optimizer off)                              | -2169095602568752481 | t      | {}
    (4 rows)
    • Hapus hint dengan ID tertentu.

      SELECT hint_plan.delete_hint_table(1);

      Informasi berikut dikembalikan:

      WARNING:  "max_appendonly_tables": setting is deprecated, and may be removed in a future release.
                                                                       delete_hint_table
      ---------------------------------------------------------------------------------------------------------------------------------------------------
       (1,"SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2;","","MergeJoin(t1 t2) Leading((t1 t2)) ",-4733464863014584191,f,{})
      (1 row)

      Minta tabel hint_plan.hints dengan hint tertentu dihapus.

      SELECT * FROM hint_plan.hints;

      Informasi berikut dikembalikan:

       id |                             norm_query_string                             | application_name |                      hints                      |      query_hash      | enable | prepare_param_strings
      ----+---------------------------------------------------------------------------+------------------+-------------------------------------------------+----------------------+--------+-----------------------
        2 | SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2; |                  | HashJoin(t1 t2) Leading((t1 t2))                | -4733464863014584191 | t      | {}
        3 | select * from t1 join t2 on t1.val = t2.val;                              |                  | set(optimizer on) set(rds_optimizer_options 0)  | -2169095602568752481 | f      | {}
        4 | select * from t1 join t2 on t1.val = t2.val;                              |                  | set(optimizer off)                              | -2169095602568752481 | t      | {}
      (3 rows)
    • Hapus hint yang didefinisikan oleh pernyataan SQL tertentu, nama hint, dan nama aplikasi.

      SELECT hint_plan.delete_hint_table('SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < 5 and t2.val > 1;', 'HashJoin(t1 t2) Leading((t1 t2))');

      Informasi berikut dikembalikan:

                                                                      delete_hint_table
      --------------------------------------------------------------------------------------------------------------------------------------------------
       (2,"SELECT * FROM t1, t2 WHERE t1.id = t2.id and t1.val < $1 and t2.val > $2;","","HashJoin(t1 t2) Leading((t1 t2)) ",-4733464863014584191,t,{})
      (1 row)

      Minta tabel hint_plan.hints dengan hint tertentu dihapus.

      SELECT * FROM hint_plan.hints;

      Informasi berikut dikembalikan:

       id |              norm_query_string               | application_name |                      hints                      |      query_hash      | enable | prepare_param_strings
      ----+----------------------------------------------+------------------+-------------------------------------------------+----------------------+--------+-----------------------
        3 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer on) set(rds_optimizer_options 0)  | -2169095602568752481 | f      | {}
        4 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer off)                              | -2169095602568752481 | t      | {}
      (2 rows)
    • Hapus hint yang didefinisikan oleh pernyataan SQL tertentu dan nama aplikasi.

      SELECT hint_plan.delete_all_hint_table('select * from t1 join t2 on t1.val = t2.val;');

      Informasi berikut dikembalikan:

                                                             delete_all_hint_table
      -----------------------------------------------------------------------------------------------------------------------------------
       (3,"select * from t1 join t2 on t1.val = t2.val;","","set(optimizer on) set(rds_optimizer_options 0) ",-2169095602568752481,f,{})
       (4,"select * from t1 join t2 on t1.val = t2.val;","","set(optimizer off) ",-2169095602568752481,t,{})
      (2 rows)

      Minta tabel hint_plan.hints dengan hint tertentu dihapus.

      SELECT * FROM hint_plan.hints;

      Informasi berikut dikembalikan:

       id | norm_query_string | application_name | hints | query_hash | enable | prepare_param_strings
      ----+-------------------+------------------+-------+------------+--------+-----------------------
      (0 rows)
  • Fungsi untuk Mengaktifkan Hint

    • Aktifkan hint dengan ID tertentu. Setelah hint tertentu diaktifkan, hint lain untuk pola SQL yang sama tidak diterapkan.

      hint_plan.enable_hint_table(<id>)
    • Aktifkan hint yang didefinisikan oleh pernyataan SQL tertentu, nama hint, dan nama aplikasi. Setelah hint tertentu diaktifkan, hint lain untuk pola SQL yang sama dinonaktifkan.

      hint_plan.enable_hint_table(<query>, <hint>, <application_name>)
    • Nonaktifkan hint dengan ID tertentu.

      hint_plan.disable_hint_table(<id>)
    • Nonaktifkan hint yang didefinisikan oleh pernyataan SQL tertentu, nama hint, dan nama aplikasi.

      hint_plan.disable_hint_table(<query>, <hint>, <application_name>)
    • Nonaktifkan hint yang didefinisikan oleh pernyataan SQL tertentu dan nama aplikasi.

      hint_plan.disable_all_hint_table(<query>, <application_name>)

    Parameter

    Deskripsi

    id

    ID hint dalam tabel hint_plan.hints.

    query

    Pernyataan SQL yang mungkin atau mungkin tidak mengandung hint.

    hint

    Hint.

    application_name

    Aplikasi yang terdaftar dengan hint. Nilainya adalah string kosong ('').

    Contoh:

    Minta tabel hint_plan.hints asli.

    SELECT * FROM hint_plan.hints;

    Informasi berikut dikembalikan:

     id |              norm_query_string               | application_name |                      hints                      |      query_hash      | enable | prepare_param_strings
    ----+----------------------------------------------+------------------+-------------------------------------------------+----------------------+--------+-----------------------
      5 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer off)                              | -2169095602568752481 | f      | {}
      6 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer on) set(rds_optimizer_options 0)  | -2169095602568752481 | t      | {}
    (2 rows)
    • Nonaktifkan hint dengan ID tertentu.

      SELECT hint_plan.disable_hint_table(6);

      Informasi berikut dikembalikan:

                                                              disable_hint_table
      -----------------------------------------------------------------------------------------------------------------------------------
       (6,"select * from t1 join t2 on t1.val = t2.val;","","set(optimizer on) set(rds_optimizer_options 0) ",-2169095602568752481,f,{})
      (1 row)

      Minta tabel hint_plan.hints dengan hint tertentu dinonaktifkan.

      SELECT * FROM hint_plan.hints;

      Informasi berikut dikembalikan:

       id |              norm_query_string               | application_name |                      hints                      |      query_hash      | enable | prepare_param_strings
      ----+----------------------------------------------+------------------+-------------------------------------------------+----------------------+--------+-----------------------
        5 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer off)                              | -2169095602568752481 | f      | {}
        6 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer on) set(rds_optimizer_options 0)  | -2169095602568752481 | f      | {}
      (2 rows)
    • Aktifkan hint dengan ID tertentu.

      SELECT hint_plan.enable_hint_table(5);

      Informasi berikut dikembalikan:

                                                 enable_hint_table
      -------------------------------------------------------------------------------------------------------
       (5,"select * from t1 join t2 on t1.val = t2.val;","","set(optimizer off) ",-2169095602568752481,t,{})
      (1 row)

      Minta tabel hint_plan.hints dengan hint tertentu diaktifkan.

      SELECT * FROM hint_plan.hints;

      Informasi berikut dikembalikan:

       id |              norm_query_string               | application_name |                      hints                      |      query_hash      | enable | prepare_param_strings
      ----+----------------------------------------------+------------------+-------------------------------------------------+----------------------+--------+-----------------------
        6 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer on) set(rds_optimizer_options 0)  | -2169095602568752481 | f      | {}
        5 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer off)                              | -2169095602568752481 | t      | {}
      (2 rows)
    • Aktifkan hint yang didefinisikan oleh pernyataan SQL tertentu dan nama aplikasi.

      SELECT hint_plan.enable_hint_table('select * from t1 join t2 on t1.val = t2.val;', 'set(optimizer off)');

      Informasi berikut dikembalikan:

                                                 enable_hint_table
      -------------------------------------------------------------------------------------------------------
       (5,"select * from t1 join t2 on t1.val = t2.val;","","set(optimizer off) ",-2169095602568752481,t,{})
      (1 row)

      Minta tabel hint_plan.hints dengan hint tertentu diaktifkan.

      SELECT * FROM hint_plan.hints;

      Informasi berikut dikembalikan:

       id |              norm_query_string               | application_name |                      hints                      |      query_hash      | enable | prepare_param_strings
      ----+----------------------------------------------+------------------+-------------------------------------------------+----------------------+--------+-----------------------
        6 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer on) set(rds_optimizer_options 0)  | -2169095602568752481 | f      | {}
        5 | select * from t1 join t2 on t1.val = t2.val; |                  | set(optimizer off)                              | -2169095602568752481 | t      | {}
      (2 rows)

Copot pemasangan ekstensi pg_hint_plan

Jika Anda tidak lagi memerlukan fitur hint, jalankan pernyataan berikut untuk mencopot pemasangan ekstensi pg_hint_plan:

DROP EXTENSION pg_hint_plan;

Referensi

Gunakan Hint untuk Memodifikasi Rencana Eksekusi