本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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
為 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>
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 和非 HASH JOIN。