T-SQL クエリヒントを使用して Babelfish クエリのパフォーマンスを向上させる - Amazon Aurora

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」を参照してください。Aurora PostgreSQL でサポートされているこの拡張機能の詳細については、「Aurora PostgreSQL リリースノート」の「Amazon Aurora PostgreSQL の拡張機能バージョン」を参照してください。

クエリオプティマイザは、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> GO 1> EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on'; 2> GO 1> SET BABELFISH_SHOWPLAN_ALL ON; 2> GO 1> 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 では機能しません。