使用 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 為 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

限制

使用查詢提示時,請考慮下列限制:

  • 如果在 enable_pg_hint 開啟之前已快取查詢計劃,則不會在相同工作階段中套用提示。它將在新的工作階段中套用。

  • 如果明確地提供結構描述名稱,則無法套用提示。您可以使用資料表別名做為解決方法。

  • 查詢提示無法套用至檢視和子查詢。

  • 提示不適用於搭配 JOIN 的 UPDATE/DELETE 陳述式。

  • 系統會忽略不存在索引或資料表的索引提示。

  • FORCE ORDER 提示不適用於 HASH JOIN 和非 HASH JOIN。