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

AnalyticDB:ヒントの使用

最終更新日:Aug 25, 2026

クラウドネイティブデータウェアハウス AnalyticDB for PostgreSQL 用の pg_hint_plan プラグインは、ヒント機能を提供します。 ヒントとは、SQL 文に追加して実行計画に影響を与えたりチューニングしたりすることで、SQL 文のパフォーマンスを向上させることができるコメントです。

バージョンの制限

  • マイナーエンジンバージョンが V6.3.8.1 から V6.3.8.9 未満の場合、pg_hint_plan プラグインをインストールすると、ヒント機能がデフォルトで有効になります。

  • マイナーエンジンバージョンが V6.3.8.1 より前の場合、pg_hint_plan プラグインをインストールする前に、V6.3.8.1 以降のバージョンにアップグレードする必要があります。

  • マイナーエンジンバージョン V6.3.8.9 以降では、プラグインをインストールまたはアップグレードするには、チケットを起票してテクニカルサポートに問い合わせる必要があります。

    マイナーエンジンバージョンの確認方法とアップグレード方法の詳細については、「マイナーエンジンバージョンの確認」および「バージョンのアップグレード」をご参照ください。

機能

AnalyticDB for PostgreSQL のオプティマイザは、固定ルールではなく統計情報に基づいて、SQL ステートメントで利用できる各種実行演算子のコストを評価します。その後、オプティマイザは最もコストの低い実行演算子の組み合わせを選択します。オプティマイザは最適な実行計画を選択しようとしますが、データに潜在的な相関があるため、生成された実行計画が現在のシナリオでは最適ではない場合があります。

pg_hint_plan プラグインは、ヒントを使用して SQL ステートメントの実行計画を強制およびチューニングします。チューニング済みの SQL ステートメントテンプレートと、それに対応するヒントルールを登録することもできます。システムが登録済みのテンプレートに一致する SQL ステートメントを検出すると、チューニング済みの実行計画が自動的に生成され、実行効率が向上します。一致するテンプレートは、元の SQL ステートメントと同じ構造を持ちますが、パラメータ部分に異なる定数値を含めることができます。

ヒント機能の有効化

次のコマンドを実行して、エクステンションをインストールし、ヒント機能を有効にします。

CREATE EXTENSION pg_hint_plan;
説明

ヒント機能は、エクステンションがインストールされているライブラリでのみ利用可能です。

サポートされるヒント

カテゴリ

形式

説明

ステートメントレベルの GUC パラメータの設定

Set(GUC-param value)

オプティマイザフェーズの GUC パラメータを設定します。

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

  • ステートメントレベルで ORCA オプティマイザを無効にするには、このヒントを SET(optimizer off) ステートメントと併用します。

  • ステートメントレベルで ORCA オプティマイザを使用するには、このヒントを SET(<ORCA_related_intervention_parameter> <parameter_value>) ステートメントと併用します。

スキャン方式ヒント

SeqScan(table)

シーケンシャルスキャンを強制します。

TidScan(table)

TID スキャンを強制します。

IndexScan(table[ index...])

インデックススキャンを強制します。インデックスを指定できます。

IndexOnlyScan(table[ index...])

インデックスオンリースキャンを強制します。インデックスを指定できます。

BitmapScan(table[ index...])

ビットマップインデックススキャンを強制します。

NoSeqScan(table)

シーケンシャルスキャンを無効にします。

NoTidScan(table)

TID スキャンを無効にします。

NoIndexScan(table)

インデックススキャンを無効にします。

NoIndexOnlyScan(table)

インデックスオンリースキャンを無効にします。

NoBitmapScan(table)

ビットマップインデックススキャンを無効にします。

結合方式ヒント

説明

[結合順序ヒント]と併用する必要があります。

NestLoop(table table[ table...])

ネステッドループ結合を強制します。

HashJoin(table table[ table...])

ハッシュ結合を強制します。

MergeJoin(table table[ table...])

マージ結合を強制します。

NoNestLoop(table table[ table...])

ネステッドループ結合を無効にします。

NoHashJoin(table table[ table...])

ハッシュ結合を無効にします。

NoMergeJoin(table table[ table...])

マージ結合を無効にします。

結合順序ヒント

Leading(table table[ table...])

特定の結合順序を強制します。

Leading(<join pair>)

特定の結合順序と方向を強制します。

行数補正ヒント

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

指定されたテーブルの結合結果の行数を補正します。

使用可能な補正方法は、絶対値 #<n>、加算 + <n>、減算 - <n>、乗算 * <n> です。

<n> は strtod 関数で読み取れる数値です。

説明

ROWS は合計行数を変更します。返されるクエリプランには、各ノードの平均行数 (合計行数 / ノード数) が表示されます。

説明
  • GUC パラメータを設定するヒントを除き、ヒントは Postgres クエリオプティマイザでのみ有効となり、ORCA オプティマイザでは有効になりません。

  • 並列度に関連するヒントはサポートされていません。

例:

  • ステートメントレベルの GUC パラメータの設定

    オプティマイザフェーズの GUC パラメータ設定は、ORCA オプティマイザと Postgres クエリオプティマイザの両方に対して有効です。

    • 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 オプティマイザを使用しません。

    • ORCA オプティマイザを強制的に有効にするには:

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

      ORCA オプティマイザを強制的に有効にすると、すべてのシナリオで使用されるようになります。データベースは、プランの作成に失敗した場合にのみ ORCA オプティマイザを使用しません。

    • 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;
  • スキャン方式ヒント

    以下の内容は Postgres クエリオプティマイザにのみ適用されます。Postgres クエリオプティマイザを使用する前に、次のコマンドを実行して 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 条件が存在する場合にのみ使用できます。

  • 結合方式と結合順序ヒント

    以下の内容は Postgres クエリオプティマイザにのみ適用されます。続行する前に、次のコマンドを実行して ORCA オプティマイザを無効にしてください。

    SET optimizer to off;
    • t1 を左側テーブルとし、結合タイプを MergeJoin に設定するには:

      /*+ 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 を左側テーブルとし、HashJoin を無効にするには:

      /*+ 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;
  • 行数補正ヒント

    以下のヒントは Postgres クエリオプティマイザにのみ適用されます。使用する前に、次のコマンドを実行して 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 分の 1 に減らすには:

      /*+ 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_hint

on

ヒントを使用してプランに影響を与えるかどうかを指定します。有効な値:

  • on:ヒントによるプランへの影響を有効にします。

  • off:ヒントによるプランへの影響を無効にします。

pg_hint_plan.enable_hint_table

off

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

  • on:ヒント登録機能を有効にします。

  • off:ヒント登録機能を無効にします。

pg_hint_plan.jumble_mode

off

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

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

  • off:スキーマとオブジェクト名を使用してオブジェクトを区別します。同じスキーマ配下で、同じ名前を持つ同じタイプのオブジェクトは、同じオブジェクトとして識別されます。

説明

このパラメーターを頻繁に切り替えないでください。切り替えた後、切り替え前に登録したルールは識別できなくなります。

pg_hint_plan.parse_messages

info

ヒント解析フェーズでのエラーメッセージのログレベルを制御します。有効な値:

error、warning、notice、info、log、および debug [1-5]。

pg_hint_plan.message_level

log

他のヒントフェーズでのエラーメッセージのログレベルを制御します。有効な値:

error、warning、notice、info、log、および debug [1-5]。

ヒントの登録

特定の SQL テンプレートに一致する SQL ステートメントにヒントを自動的に適用する場合、または SQL ステートメントにヒントを追加できない場合は、hint_plan.hints システムテーブルにヒントを登録できます。ヒントを登録すると、テンプレートに一致する SQL ステートメントを実行する際に、ヒントに基づいてチューニングされた実行計画が自動的に生成されます。

hint_plan.hints テーブルのスキーマは次のとおりです。

内容

id

integer

登録されたヒントルールの ID です。値はデフォルトでインクリメントされます。

norm_query_string

text

パラメーター (Param) と定数 (Const) を除いた SQL ステートメントテンプレートです。

application_name

text

登録されたヒントルールのアプリケーション ID 文字列です。これは、複数のアプリケーション間でルールを隔離するために使用されます。デフォルト値は '' で、隔離なしを意味します。このトピックの関数例では、このパラメーターは '' に設定されています。

application_name 列には一意キー制約があります。

hints

text

SQL ステートメントテンプレートに登録するヒントです。

hints 列には一意キー制約があります。

query_hash

bigint

パラメーター化された SQL ステートメントテンプレートのハッシュ値であり、正規化された SQL の一意の識別子です。

query_hash 列には一意キー制約があります。

enable

ブール型

ヒントルールがアクティブかどうかを制御します。同じ SQL ステートメントテンプレートに対して使用できるヒントルールは 1 つだけです。

prepare_param_strings

text

登録されたクエリが PREPARE 文の場合、この列は PREPARE 文のパラメーターを記録します。

説明

hint_plan.hints テーブルを直接クエリすることはできますが、直接変更してはいけません。テーブルを変更するには、対応する関数を使用する必要があります。

以降のセクションでは、ヒント登録関数について説明します。

  • SQL ステートメントのパラメーター化関数

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

    パラメーター

    説明

    query

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

    application_name

    登録されたヒントルールのアプリケーション ID 文字列です。空 ('') のままにしてください。

    この関数は、ヒントを含む SQL ステートメントのパラメーター情報を取得します。次の情報が返されます。

    パラメーター

    説明

    query_hash

    パラメーター化された SQL ステートメントテンプレートのハッシュ値であり、正規化された SQL の一意の識別子です。

    norm_query_string

    SQL ステートメントテンプレートです。

    comment_hints

    ステートメントから抽出されたヒントです。

    first_matched_hint_in_table

    hint_plan.hints テーブル内で、SQL ステートメントテンプレートに一致するヒントです。

    prepare_param_strings

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

    パラメーター

    説明

    query

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

    application_name

    登録されたヒントルールのアプリケーション ID 文字列です。空 ('') のままにしてください。

    この関数を使用して、同じ SQL ステートメントテンプレートに対して異なるヒントルールを登録できます。既存のルールと同じ SQL ステートメントテンプレート、ヒント、およびアプリケーション ID 文字列を持つヒントルールを挿入しようとしても、重複したルールは作成されません。代わりに、新しいヒントルールが有効になり、同じテンプレートの他のすべてのヒントルールは無効になります。

    例:

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

    パラメーター

    説明

    query

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

    application_name

    登録されたヒントルールのアプリケーション ID 文字列です。空 ('') のままにしてください。

    SQL ステートメントのパラメーターテンプレートに対してアクティブなヒントが存在する場合、hint_plan.hints テーブル内の元のヒントは query に含まれるヒントに置き換えられます。アクティブなヒントが利用できない場合は、新しいヒントルールが登録されます。

    例:

    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 ステートメント、ヒント、およびアプリケーション ID 文字列に一致するヒントルールを削除するには:

      hint_plan.delete_hint_table(<query>, <hint>, <application_name>)
    • 特定の SQL ステートメントとアプリケーション ID 文字列に一致するすべてのヒントルールを削除するには:

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

    パラメーター

    説明

    id

    hint_plan.hints テーブル内の ID です。

    query

    SQL ステートメントです。ヒントを含める必要はありません。

    hint

    ヒントです。

    application_name

    登録されたヒントルールのアプリケーション ID 文字列です。空 ('') のままにしてください。

    例:

    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 ステートメント、ヒント、およびアプリケーション ID 文字列でヒントルールを削除します。

      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 ステートメントとアプリケーション ID 文字列でヒントルールを削除します。

      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 ステートメント、ヒント、およびアプリケーション ID 文字列に一致するヒントルールを有効にすると、同じ SQL ステートメントテンプレートの他のヒントルールは無効になります。

      hint_plan.enable_hint_table(<query>, <hint>, <application_name>)
    • 特定の ID を持つヒントルールを無効にするには:

      hint_plan.disable_hint_table(<id>)
    • 特定の SQL ステートメント、ヒント、およびアプリケーション ID 文字列に一致するヒントルールを無効にするには:

      hint_plan.disable_hint_table(<query>, <hint>, <application_name>)
    • 特定の SQL ステートメントとアプリケーション ID 文字列に一致するすべてのヒントルールを無効にするには:

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

    パラメーター

    説明

    id

    hint_plan.hints テーブル内の ID です。

    query

    SQL ステートメントです。ヒントを含める必要はありません。

    hint

    ヒントルールです。

    application_name

    登録されたヒントルールのアプリケーション ID 文字列です。空 ('') のままにしてください。

    例:

    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 ステートメントとアプリケーション ID 文字列でヒントルールを有効にします。

      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 エクステンションのアンインストール

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

DROP EXTENSION pg_hint_plan;

リファレンス

ヒントによる実行計画への影響