

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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\$1pg\$1hint 為 ON 的情況下執行命令 `sp_babelfish_configure`。

```
EXECUTE sp_babelfish_configure 'enable_pg_hint', 'on' [, 'server']
```

您可以包括 *server* 關鍵字，讓設定永久存在於整個叢集層級上。若只要設定目前工作階段的設定，請不要使用 server。

在 `enable_pg_hint` 為 ON 之後，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 和非 HASH JOIN。