T-SQL クエリヒントを使用して Babelfish クエリのパフォーマンスを向上させる
バージョン 2.3.0 以降では、Babelfish は pg_hint_plan
を使用したクエリヒントの使用をサポートしています。Aurora PostgreSQL では、pg_hint_plan
はデフォルトでインストールされます。PostgreSQL 拡張機能 pg_hint_plan
の詳細については、「https://github.com/ossc-db/pg_hint_plan
クエリオプティマイザは、SQL ステートメントの最適な実行プランを見つけるように設計されています。プランを選択する際、クエリオプティマイザはエンジンのコストモデルと列およびテーブル統計の両方を考慮します。ただし、提案されるプランはデータセットのニーズを満たさない場合があります。したがって、クエリヒントは、パフォーマンスの問題に対処して、実行プランを改善します。query hint
は SQL 標準に追加された構文であり、データベースエンジンにクエリの実行方法を指示します。例えば、ヒントは、シーケンシャルスキャンを実行して、クエリオプティマイザが選択したプランをオーバーライドするようにエンジンに指示する場合があります。
Babelfish で T-SQL クエリヒントを有効にする
現在、Babelfish はデフォルトですべての T-SQL ヒントを無視します。T-SQL ヒントを適用するには、enable_pg_hint 値を ON にして、コマンド sp_babelfish_configure
を実行します。
EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on' [, 'server']
クラスタ全体のレベルで設定を永続化するには、server キーワードを含めます。現在のセッションについてのみ設定する場合は、server を使用しません。
enable_pg_hint
がオンになると、Babelfish は以下の T-SQL ヒントを適用します。
-
INDEX ヒント
-
JOIN ヒント
-
FORCE ORDER ヒント
-
MAXDOP ヒント
例えば、次のコマンドシーケンスは pg_hint_plan
をオンにします。
1>
CREATE TABLE t1 (a1 INT PRIMARY KEY, b1 INT);2>
CREATE TABLE t2 (a2 INT PRIMARY KEY, b2 INT);3>
GO1>
EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on';2>
GO1>
SET BABELFISH_SHOWPLAN_ALL ON;2>
GO1>
SELECT * FROM t1 JOIN t2 ON t1.a1 = t2.a2; --NO HINTS (HASH JOIN)2>
GO
SELECT ステートメントにはヒントは適用されません。ヒントのないクエリプランが返されます。
QUERY PLAN
---------------------------------------------------------------------------
Query Text: SELECT * FROM t1 JOIN t2 ON t1.a1 = t2.a2
Hash Join (cost=60.85..99.39 rows=2260 width=16)
Hash Cond: (t1.a1 = t2.a2)
-> Seq Scan on t1 (cost=0.00..32.60 rows=2260 width=8)
-> Hash (cost=32.60..32.60 rows=2260 width=8)
-> Seq Scan on t2 (cost=0.00..32.60 rows=2260 width=8)
1>
SELECT * FROM t1 INNER MERGE JOIN t2 ON t1.a1 = t2.a2;2>
GO
SELECT ステートメントにクエリヒントが適用されます。次の出力は、マージ結合を含むクエリプランが返されることを示しています。
QUERY PLAN
---------------------------------------------------------------------------
Query Text: SELECT/*+ MergeJoin(t1 t2) Leading(t1 t2)*/ * FROM t1 INNER JOIN t2 ON t1.a1 = t2.a2
Merge Join (cost=0.31..190.01 rows=2260 width=16)
Merge Cond: (t1.a1 = t2.a2)
-> Index Scan using t1_pkey on t1 (cost=0.15..78.06 rows=2260 width=8)
-> Index Scan using t2_pkey on t2 (cost=0.15..78.06 rows=2260 width=8)
1>
SET BABELFISH_SHOWPLAN_ALL OFF;2>
GO
制限事項
クエリヒントを使用する場合は、以下の制限事項を考慮してください。
-
enable_pg_hint
がオンになる前にクエリプランがキャッシュされた場合、ヒントは同じセッションに適用されません。新しいセッションに適用されます。 -
スキーマ名が明示的に指定された場合、ヒントは適用できません。回避策としてテーブルエイリアスを使用できます。
-
クエリヒントをビューやサブクエリに適用することはできません。
-
ヒントは、JOIN を含む UPDATE/DELETE ステートメントでは機能しません。
-
存在しないインデックスまたはテーブルについてのインデックスヒントは無視されます。
-
FORCE ORDER ヒントは、HASH JOIN と非 ANSI JOIN では機能しません。