クラウドネイティブデータウェアハウス 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 パラメータの設定 |
|
オプティマイザフェーズの GUC パラメータを設定します。 現在、GUC パラメータはオプティマイザフェーズでのみ有効となり、書き換えや実行などの他のフェーズでは有効になりません。
|
|
スキャン方式ヒント |
|
シーケンシャルスキャンを強制します。 |
|
|
TID スキャンを強制します。 |
|
|
|
インデックススキャンを強制します。インデックスを指定できます。 |
|
|
|
インデックスオンリースキャンを強制します。インデックスを指定できます。 |
|
|
|
ビットマップインデックススキャンを強制します。 |
|
|
|
シーケンシャルスキャンを無効にします。 |
|
|
|
TID スキャンを無効にします。 |
|
|
|
インデックススキャンを無効にします。 |
|
|
|
インデックスオンリースキャンを無効にします。 |
|
|
|
ビットマップインデックススキャンを無効にします。 |
|
|
結合方式ヒント 説明
[結合順序ヒント]と併用する必要があります。 |
|
ネステッドループ結合を強制します。 |
|
|
ハッシュ結合を強制します。 |
|
|
|
マージ結合を強制します。 |
|
|
|
ネステッドループ結合を無効にします。 |
|
|
|
ハッシュ結合を無効にします。 |
|
|
|
マージ結合を無効にします。 |
|
|
結合順序ヒント |
|
特定の結合順序を強制します。 |
|
|
特定の結合順序と方向を強制します。 |
|
|
行数補正ヒント |
|
指定されたテーブルの結合結果の行数を補正します。 使用可能な補正方法は、絶対値
説明
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 |
ヒントを使用してプランに影響を与えるかどうかを指定します。有効な値:
|
|
pg_hint_plan.enable_hint_table |
off |
ヒント登録機能を使用するかどうかを指定します。有効な値:
|
|
pg_hint_plan.jumble_mode |
off |
パラメータ化された SQL 文で、テーブル、関数、演算子などのオブジェクトを識別するために OID を使用するかどうかを指定します。有効な値:
説明
このパラメーターを頻繁に切り替えないでください。切り替えた後、切り替え前に登録したルールは識別できなくなります。 |
|
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 文字列です。これは、複数のアプリケーション間でルールを隔離するために使用されます。デフォルト値は
|
|
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_stringSQL ステートメントテンプレートです。
comment_hintsステートメントから抽出されたヒントです。
first_matched_hint_in_tablehint_plan.hintsテーブル内で、SQL ステートメントテンプレートに一致するヒントです。prepare_param_stringsSQL ステートメントから抽出されたパラメーターです。
例:
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に含まれるヒントに置き換えられます。アクティブなヒントが利用できない場合は、新しいヒントルールが登録されます。例:
-
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) -
ヒント変更関数を実行します。
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) -
ヒントルールを変更した後、
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>)
パラメーター
説明
idhint_plan.hintsテーブル内の ID です。querySQL ステートメントです。ヒントを含める必要はありません。
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>)
パラメーター
説明
idhint_plan.hintsテーブル内の ID です。querySQL ステートメントです。ヒントを含める必要はありません。
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;