

# T-SQL クエリヒントを使用して Babelfish クエリのパフォーマンスを向上させる
<a name="babelfish-tsql-hints"></a>

バージョン 2.3.0 以降では、Babelfish は `pg_hint_plan` を使用したクエリヒントの使用をサポートしています。Aurora PostgreSQL では、`pg_hint_plan` はデフォルトでインストールされます。PostgreSQL 拡張機能 `pg_hint_plan` の詳細については、「[https://github.com/ossc-db/pg_hint_plan](https://github.com/ossc-db/pg_hint_plan)」を参照してください。Aurora PostgreSQL でサポートされているこの拡張機能の詳細については、「*Aurora PostgreSQL リリースノート*」の「[Amazon Aurora PostgreSQL の拡張機能バージョン](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Extensions.html)」を参照してください。

 クエリオプティマイザは、SQL ステートメントの最適な実行プランを見つけるように設計されています。プランを選択する際、クエリオプティマイザはエンジンのコストモデルと列およびテーブル統計の両方を考慮します。ただし、提案されるプランはデータセットのニーズを満たさない場合があります。したがって、クエリヒントは、パフォーマンスの問題に対処して、実行プランを改善します。`query hint` は SQL 標準に追加された構文であり、データベースエンジンにクエリの実行方法を指示します。例えば、ヒントは、シーケンシャルスキャンを実行して、クエリオプティマイザが選択したプランをオーバーライドするようにエンジンに指示する場合があります。

## Babelfish で T-SQL クエリヒントを有効にする
<a name="babelfish-tsql-hints-turningon"></a>

現在、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
```

## 制限事項
<a name="babelfish-tsql-hints-limitations"></a>

クエリヒントを使用する場合は、以下の制限事項を考慮してください。
+ `enable_pg_hint` がオンになる前にクエリプランがキャッシュされた場合、ヒントは同じセッションに適用されません。新しいセッションに適用されます。
+ スキーマ名が明示的に指定された場合、ヒントは適用できません。回避策としてテーブルエイリアスを使用できます。
+ クエリヒントをビューやサブクエリに適用することはできません。
+ ヒントは、JOIN を含む UPDATE/DELETE ステートメントでは機能しません。
+ 存在しないインデックスまたはテーブルについてのインデックスヒントは無視されます。
+ FORCE ORDER ヒントは、HASH JOIN と非 ANSI JOIN では機能しません。