すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:ヒント機能を使用する

最終更新日:Sep 29, 2024

AnalyticDB for PostgreSQLのpg_hint_plan拡張機能は、ヒント機能を提供します。 この機能により、実行計画を変更および最適化できるため、SQL実行機能が向上します。

制限事項

  • V6.3.8.1以降を実行するAnalyticDB For PostgreSQLインスタンスの場合、pg_hint_plan拡張機能をインストールするとヒント機能が有効になります。

  • pg_hint_plan拡張機能をインストールする前に、インスタンスのマイナーエンジンバージョンをV6.3.8.1以降に更新することを推奨します。

  • V6.3.8.9以降を実行するインスタンスに拡張機能をインストールまたはアップグレードするには、 チケットを起票して、サービスセンターにお問い合わせください。

    インスタンスのマイナーバージョンを表示および更新する方法の詳細については、「マイナーエンジンバージョンの表示」および「マイナーエンジンバージョンの更新」をご参照ください。

概要

AnalyticDB for PostgreSQLは、静的ルールの代わりにデータ統計を利用するコストベースのオプティマイザを使用します。 オプティマイザは、SQL文の各実行計画のコストを推定し、実行のための最小コスト計画を選択します。 オプティマイザは最適な実行計画を選択するために最善を尽くしますが、データ間の相関関係を予測できないため、最終的な実行計画はシナリオに最適ではない可能性があります。

pg_hint_plan拡張機能は、ヒントを使用してSQL実行プランを変更および最適化し、最適化されたSQLパターンとヒントルールを登録できます。 これにより、同じ登録SQLパターンを使用するSQL文を実行する際に、最適化された実行プランを自動的に生成することができ、実行効率が向上します。

ヒント機能を有効にする

次のステートメントを実行してpg_hint_plan拡張機能をインストールし、ヒント機能を有効にします。

CREATE EXTENSION pg_hint_plan;
説明

ヒント機能は、pg_hint_plan拡張機能がインストールされているデータベースにのみ使用できます。

サポートされているヒント

カテゴリ

Format

説明

グランドユニファイド構成 (GUC) パラメータ設定のヒント

セット (GUC-param値)

オプティマイザの実行時にGUCパラメータを設定します。

GUCパラメーターは、オプティマイザが実行中の場合にのみ有効になり、書き換えや実行フェーズなどの他のフェーズでは有効になりません。

  • ステートメントのORCAオプティマイザを無効にするには、ステートメントにSET(optimizer off) を追加することを推奨します。

  • ステートメントのORCAオプティマイザを有効にするには、SET(<ORCAパラメーター><value>) をステートメントに追加することを推奨します。

スキャン方法のヒント

SeqScan (テーブル)

順次スキャンをテーブルに強制します。

TidScan (テーブル)

タプル識別子 (TID) スキャンをテーブルに強制します。

IndexScan (テーブル [インデックス...])

インデックススキャンをテーブルに強制します。 インデックスを指定できます。

IndexOnlyScan (テーブル [インデックス...])

テーブルのインデックスのみのスキャンを強制します。 インデックスを指定できます。

BitmapScan (テーブル [インデックス...])

テーブルのビットマップインデックススキャンを強制します。

NoSeqScan (テーブル)

テーブル上のシーケンシャルスキャンを禁止します。

NoTidScan (テーブル)

テーブル上のTIDスキャンを禁止します。

NoIndexScan (テーブル)

テーブル上のインデックススキャンを禁止します。

NoIndexOnlyScan (テーブル)

テーブル上のインデックスのみのスキャンを禁止します。

NoBitmapScan (テーブル)

テーブルのビットマップインデックススキャンを禁止します。

結合メソッドのヒント

説明

結合メソッドのヒントは、結合順序のヒントと一緒に使用する必要があります。

NestLoop (テーブルテーブル [テーブル...])

指定されたテーブルで構成される結合に対して、ネストされたループを強制します。

HashJoin (テーブルテーブル [テーブル...])

指定されたテーブルで構成される結合のハッシュ結合を強制します。

MergeJoin (テーブルテーブル [テーブル...])

指定されたテーブルで構成される結合のマージ結合を強制します。

NoNestLoop (テーブルテーブル [テーブル...])

指定されたテーブルで構成される結合のネストループを禁止します。

NoHashJoin (テーブルテーブル [テーブル...])

指定されたテーブルで構成される結合のハッシュ結合を禁止します。

NoMergeJoin (テーブルテーブル [テーブル...])

指定されたテーブルで構成される結合のマージ結合を禁止します。

参加注文のヒント

リーディング (テーブルテーブル [テーブル...])

指定されたとおりに参加順序を強制します。

リーディング (<参加ペア>)

フォースは、指定された順序と方向を結合します。

行番号修正のヒント

行 (テーブルテーブル [テーブル...] 修正)

指定されたテーブルで構成される結合の結果の行番号を修正します。

利用可能な補正方法は、絶対値# <n> 、加算 + <n> 、減算 − <n> 、および乗算 * <n> である。

<n> はstrtod() が読み取れる文字列です。

説明

ヒントRowsは行の総数を修正しますが、クエリ結果はノードあたりの平均行数 (行の総数 /ノード数) を示します。

説明
  • GUCパラメーター設定のヒント以外のヒントは、ORCAオプティマイザではなく、PostgreSQLクエリオプティマイザでのみ有効になります。

  • ヒントを使用して、並列度 (DOP) を変更することはできません。

例:

  • GUCパラメータ設定のヒント

    オプティマイザの実行時に行われたGUCパラメーター設定は、ORCAオプティマイザとクエリオプティマイザの両方で有効になります。

    • ORCAオプティマイザを無効にします。

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

      ORCAオプティマイザを無効にすると、使用されません。

    • ORCAオプティマイザを有効にします。

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

      ORCAオプティマイザを有効にすると、それが使用されます。 ORCAオプティマイザはほとんどの場合に使用され、単一のテーブルに対するクエリや過度のパーティションテーブルなどの特定のシナリオでのみ使用されるわけではありません。

    • ORCAオプティマイザを強制的に有効にします。

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

      ORCAオプティマイザを強制的に有効にすると、常に使用されます。 ORCAオプティマイザは、プランを作成できない場合にのみ使用されません。

    • ORCAオプティマイザを強制的に有効にし、ORCAオプティマイザのHashJoinを無効にします。

      /*+ SET(optimizer on) SET(rds_optimizer_options 0) SET(optimizer_enable_hashjoin off) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
  • スキャン方法のヒント

    スキャン方法のヒントは、クエリオプティマイザにのみ適しています。 ORCAオプティマイザを無効にするには、次のステートメントを実行する必要があります。

    SET optimizer to off;
    • テーブルt1にインデックススキャンを強制する。

      /*+ Indexscan(t1) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • テーブルt1のインデックススキャンを禁止します。

      /*+ NoIndexscan(t1) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • t1_valビットマップインデックスを使用して、テーブルt1のビットマップインデックススキャンを強制します。

      /*+ Bitmapscan(t1 t1_val) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • テーブルt1にインデックスのみのスキャンを強制する。

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

      インデックスのみのスキャンは、インデックスのみの列でのみ使用できます。

    • テーブルt1上の強制TIDスキャン。

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

      TIDスキャンは、TID条件を含むテーブルでのみ使用できます。

  • 結合方法と結合順序のヒント

    スキャン方法のヒントは、クエリオプティマイザにのみ適しています。 ORCAオプティマイザを無効にするには、次のステートメントを実行する必要があります。

    SET optimizer to off;
    • テーブルt1が左側のテーブルの場合、強制マージ結合。

      /*+ Leading((t1 t2)) MergeJoin(t1 t2) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • テーブルt1が左側のテーブルの場合、ネストされたループ結合を強制します。

      /*+ Leading((t1 t2)) NestLoop(t1 t2) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • テーブルt1が左側のテーブルの場合、ハッシュ結合を禁止します。

      /*+ Leading((t1 t2)) NoHashJoin(t1 t2) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • t2とt3のハッシュ結合を強制し、次に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;
  • 行番号修正のヒント

    スキャン方法のヒントは、クエリオプティマイザにのみ適しています。 ORCAオプティマイザを無効にするには、次のステートメントを実行する必要があります。

    SET optimizer to off;
    • t1とt2を結合して得られたテーブルの行の総数を100回増やす。

      /*+ Rows(t1 t2 *100) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • t1とt2を結合して得られたテーブルの行の総数を100回減らします。

      /*+ Rows(t1 t2 *0.01) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • t1とt2を結合して得られたテーブルの行の総数を100増やす。

      /*+ Rows(t1 t2 +100) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • t1とt2を結合することによって得られたテーブル内の行の総数から100を引く。

      /*+ Rows(t1 t2 -100) */EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.val = t2.val;
    • t1とt2を結合して取得したテーブルに100する行の総数を修正します。

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

GUCパラメータ

パラメーター

デフォルト値

説明

pg_hint_plan.enable_ヒント

on

ヒント機能を有効にして実行計画を変更するかどうかを指定します。 有効な値:

  • on

  • off

pg_hint_plan.enable_hint_テーブル

off

ヒント登録機能を有効にするかどうかを指定します。 有効な値:

  • on

  • off

pg_hint_plan.jumble_モード

off

オブジェクト識別子 (OID) を使用して、テーブル、関数、演算子などのパラメータ化されたSQL文のオブジェクトを識別するかどうかを指定します。 有効な値:

  • on: OIDを使用してオブジェクトを識別します。 オブジェクトが削除された後、削除されたオブジェクトと同じ名前を使用して作成された別のオブジェクトは、別のオブジェクトと見なされます。

  • off: スキーマとオブジェクト名を使用してオブジェクトを識別します。 同じスキーマ内の同じ名前のオブジェクトは、同じオブジェクトと見なされます。

説明

このパラメーターは頻繁に変更しないことを推奨します。 このパラメーターを変更すると、以前に登録されたヒントは使用できません。

pg_hint_plan.parse_メッセージ

info

ヒント解析エラーのログレベル。 有効な値:

エラー、警告、通知、情報、ログ、デバッグ [1-5] 。

pg_hint_plan.message_レベル

log

ヒント解析以外のフェーズでのエラーのログレベル。 有効な値:

エラー、警告、通知、情報、ログ、デバッグ [1-5] 。

ヒントの登録

同じSQLパターンを使用するSQL文に自動的にヒントを適用したい場合や、SQL文にヒントを追加できない場合は、hint_plan.hintsシステムテーブルに追加して登録できます。 ヒントが登録された後、同じSQLパターンを使用するSQL文が実行されると、ヒント最適化された実行計画が自動的に生成されます。

次の表に、hint_plan.hintsテーブルの列を示します。

データ型

説明

id

integer

ヒントを識別する一意の番号。 この列はシーケンスによって自動的に埋められます。

norm_query_string

text

ヒントが適用されるSQLパターン。 SQLパターンは、パラメータや定数を含まないSQL文です。

application_name

text

ヒントに登録されたアプリケーション。 デフォルト値は空の文字列 ('') で、ヒントがすべてのアプリケーションに適用されることを示します。 次の例では、この列の値は空の文字列 ('') です。

application_name列にはUNIQUE制約があります。

ヒント

text

登録するヒント。

ヒント列にはUNIQUE制約があります。

query_hash

bigint

パラメーター化されたSQLパターンのハッシュ値。標準SQL文の一意の識別子です。

query_hash列にはUNIQUE制約があります。

enable

Boolean

ヒントを有効にするかどうかを指定します。 SQLパターンに適用できるヒントは1つだけです。

prepare_param_strings

text

PREPAREステートメントが使用されている場合に記録されるパラメーター。

説明

hint_plan.hintsテーブルはクエリできますが、直接変更しないことをお勧めします。 関数を変更してテーブルを変更することを推奨します。

ヒントの登録に使用する関数について説明します。

  • SQL文のパラメーターを取得する関数

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

    パラメーター

    説明

    クエリ

    ヒントを含むSQLステートメント。

    application_name

    ヒントに登録されたアプリケーション。 値は空の文字列 ('') です。

    この関数は、ヒントを含むSQL文のパラメーターを取得するために使用されます。 次の表に、取得できるパラメーターを示します。

    パラメーター

    説明

    query_hash

    パラメーター化されたSQLパターンのハッシュ値。標準SQL文の一意の識別子です。

    norm_query_string

    SQLパターン。

    comment_ヒント

    ヒント。

    first_matched_hint_in_テーブル

    SQLパターンと一致するhint_plan.hintsテーブル内のヒント。

    prepare_param_文字列

    SQL文のパラメーター。

    例:

    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;');

    次の情報が返されます。

    -[ 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       | {}
  • ヒントの登録に使用する関数

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

    パラメーター

    説明

    クエリ

    ヒントを含むSQLステートメント。

    application_name

    ヒントに登録されたアプリケーション。 値は空の文字列 ('') です。

    この関数は、同じSQLパターンに対して異なるヒントを登録するために使用できます。 同じSQLパターン、ヒント名、およびアプリケーション名を持つヒントを挿入すると、hint_plan.hintsテーブルに新しいヒントは追加されません。 挿入されたヒントは有効になり、既存のヒントは無効になります。

    例:

    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;');

    次の情報が返されます。

                                                                     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)
  • ヒントの変更に使用する関数

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

    パラメーター

    説明

    クエリ

    ヒントを含むSQLステートメント。

    application_name

    ヒントに登録されたアプリケーション。 値は空の文字列 ('') です。

    SQL文で使用されるSQLパターンにヒントが含まれている場合、hint_plan.hintsテーブルの既存のヒントは、queryで指定されたSQL文に含まれるヒントに置き換えられます。 SQLパターンにヒントが含まれていない場合は、新しいヒントが登録されます。

    例:

    1. hint_plan.hintsテーブルの既存のヒントを照会します。

      SELECT * FROM hint_plan.hints;

      次の情報が返されます。

       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. ヒントを変更する関数を呼び出します。

      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;');

      次の情報が返されます。

                                                                      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. hint_plan.hintsテーブルの変更されたヒントを照会します。

      SELECT * FROM hint_plan.hints;

      SQLパターンのヒントは、Nestloop(t1 t2) Leading((t1 t2)) からHashJoin(t1 t2) Leading(((t1 t2))) に変わります。 次の情報が返されます。

       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)
  • ヒントを削除する関数

    • 指定したIDのヒントを削除します。

      hint_plan.delete_hint_table(<id>)
    • 指定したSQL文、ヒント名、およびアプリケーション名で定義されているヒントを削除します。

      hint_plan.delete_hint_table(<query>, <hint>, <application_name>)
    • 指定したSQL文とアプリケーション名で定義されているヒントを削除します。

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

    パラメーター

    説明

    id

    hint_plan.hintsテーブルのヒントID。

    クエリ

    ヒントを含む場合と含まない場合があるSQLステートメント。

    ヒント

    ヒント。

    application_name

    ヒントに登録されたアプリケーション。 値は空の文字列 ('') です。

    例:

    元のhint_plan.hintsテーブルを照会します。

    SELECT * FROM hint_plan.hints;

    次の情報が返されます。

     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)
    • 指定したIDのヒントを削除します。

      SELECT hint_plan.delete_hint_table(1);

      次の情報が返されます。

      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)

      指定されたヒントが削除されたhint_plan.hintsテーブルを照会します。

      SELECT * FROM hint_plan.hints;

      次の情報が返されます。

       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)
    • 指定したSQL文、ヒント名、およびアプリケーション名で定義されているヒントを削除します。

      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))');

      次の情報が返されます。

                                                                      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)

      指定されたヒントが削除されたhint_plan.hintsテーブルを照会します。

      SELECT * FROM hint_plan.hints;

      次の情報が返されます。

       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)
    • 指定したSQL文とアプリケーション名で定義されているヒントを削除します。

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

      次の情報が返されます。

                                                             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)

      指定されたヒントが削除されたhint_plan.hintsテーブルを照会します。

      SELECT * FROM hint_plan.hints;

      次の情報が返されます。

       id | norm_query_string | application_name | hints | query_hash | enable | prepare_param_strings
      ----+-------------------+------------------+-------+------------+--------+-----------------------
      (0 rows)
  • ヒントを有効にする関数

    • 指定したIDでヒントを有効にします。 指定されたヒントを有効にすると、同じSQLパターンの他のヒントは適用されません。

      hint_plan.enable_hint_table(<id>)
    • 指定されたSQL文、ヒント名、およびアプリケーション名で定義されたヒントを有効にします。 指定されたヒントが有効になると、同じSQLパターンの他のヒントは無効になります。

      hint_plan.enable_hint_table(<query>, <hint>, <application_name>)
    • 指定したIDでヒントを無効にします。

      hint_plan.disable_hint_table(<id>)
    • 指定したSQL文、ヒント名、およびアプリケーション名で定義されているヒントを無効にします。

      hint_plan.disable_hint_table(<query>, <hint>, <application_name>)
    • 指定したSQL文とアプリケーション名で定義されているヒントを無効にします。

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

    パラメーター

    説明

    id

    hint_plan.hintsテーブルのヒントID。

    クエリ

    ヒントを含む場合と含まない場合があるSQLステートメント。

    ヒント

    ヒント。

    application_name

    ヒントに登録されたアプリケーション。 値は空の文字列 ('') です。

    例:

    元のhint_plan.hintsテーブルを照会します。

    SELECT * FROM hint_plan.hints;

    次の情報が返されます。

     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)
    • 指定したIDでヒントを無効にします。

      SELECT hint_plan.disable_hint_table(6);

      次の情報が返されます。

                                                              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)

      指定されたヒントを無効にしてhint_plan.hintsテーブルを照会します。

      SELECT * FROM hint_plan.hints;

      次の情報が返されます。

       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)
    • 指定したIDでヒントを有効にします。

      SELECT hint_plan.enable_hint_table(5);

      次の情報が返されます。

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

      指定されたヒントを有効にしてhint_plan.hintsテーブルを照会します。

      SELECT * FROM hint_plan.hints;

      次の情報が返されます。

       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)
    • 指定されたSQL文とアプリケーション名で定義されたヒントを有効にします。

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

      次の情報が返されます。

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

      指定されたヒントを有効にしてhint_plan.hintsテーブルを照会します。

      SELECT * FROM hint_plan.hints;

      次の情報が返されます。

       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)

pg_hint_plan拡張機能をアンインストールする

ヒント機能が不要になった場合は、次のステートメントを実行してpg_hint_plan拡張機能をアンインストールします。

DROP EXTENSION pg_hint_plan;

関連ドキュメント

ヒントを使用した実行計画の変更