使用解釋計劃改善 Babelfish 查詢效能 - Amazon Aurora

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

使用解釋計劃改善 Babelfish 查詢效能

從第 2.1.0 版開始,Babelfish 包含兩個函數,以透明地使用 PostgreSQL 最佳化工具為 TDS 連接埠上的 T-SQL 查詢產生預估的和實際的查詢計劃。這些函數類似於將 SET STATISTICS PROFILE 或 SET SHOWPLAN_ALL 搭配 SQL Server 資料庫使用,以識別及改善慢速執行的查詢。

注意

目前不支援從函數、控制流程與游標取得查詢計劃。

在此表中,您可以找到 SQL Server、Babelfish 及 PostgreSQL 之間查詢計劃解釋函數的比較。

SQL Server

Babelfish

PostgreSQL

SHOWPLAN_ALL

BABELFISH_SHOWPLAN_ALL

EXPLAIN

STATISTICS PROFILE

BABELFISH_STATISTICS PROFILE

解釋分析

使用 SQL Server 最佳化工具

使用 PostgreSQL 最佳化工具

使用 PostgreSQL 最佳化工具

SQL Server 輸入與輸出格式

SQL Server 輸入與 PostgreSQL 輸出格式

PostgreSQL 輸入和輸出格式

為工作階段設定

為工作階段設定

套用至特定陳述式

支援以下項目:

  • SELECT

  • INSERT

  • UPDATE

  • DELETE

  • CURSOR

  • 製作

  • EXECUTE

  • EXEC 與函數,包括控制流程 (CASE、WHILE-BREAK-CONTINUE、WAITFOR、BEGIN-END、IF-ELSE 等等)

支援以下項目:

  • SELECT

  • INSERT

  • UPDATE

  • DELETE

  • 製作

  • EXECUTE

  • EXEC

  • RAISEERROR

  • THROW

  • PRINT

  • USE

支援以下項目:

  • SELECT

  • INSERT

  • UPDATE

  • DELETE

  • CURSOR

  • 製作

  • EXECUTE

按照下列方式使用 Babelfish 函數:

  • SET BABELFISH_SHOWPLAN_ALL [ON|OFF] – 設定 ON 以產生預估的查詢執行計劃。此函數會實作 PostgreSQL EXPLAIN 命令的行為。使用此命令可取得給定查詢的解釋計劃。

  • SET BABELFISH_STATISTICS PROFILE [ON|OFF] – 設定為 ON 以取得實際查詢執行計劃。這個函數實作 PostgreSQL 其 EXPLAIN ANALYZE 命令的行為。

如需有關在 PostgreSQL EXPLAINEXPLAIN ANALYZE 的詳細資訊,請參閱 PostgreSQL 文件中的 EXPLAIN

注意

從 2.2.0 版開始,您可以將 escape_hatch_showplan_all 參數設為 ignore,以避免在 SQL Server 語法中將 BABELFISH_ 字首用於 SHOWPLAN_ALLSTATISTICS PROFILE SET 命令。

例如,以下命令順序會開啟查詢計劃,然後傳回 SELECT 陳述式的預估查詢執行計劃,而不執行查詢。此範例透過使用 sqlcmd 命令列工具查詢 TDS 連接埠,以使用 SQL Server 範例 northwind 資料庫:

1> SET BABELFISH_SHOWPLAN_ALL ON 2> GO 1> SELECT t.territoryid, e.employeeid FROM 2> dbo.employeeterritories e, dbo.territories t 3> WHERE e.territoryid=e.territoryid ORDER BY t.territoryid; 4> GO QUERY PLAN ------------------------------------------------------------------------------------ Query Text: SELECT t.territoryid, e.employeeid FROM dbo.employeeterritories e, dbo.territories t WHERE e.territoryid=e.territoryid ORDER BY t.territoryid Sort (cost=6231.74..6399.22 rows=66992 width=10) Sort Key: t.territoryid NULLS FIRST -> Nested Loop (cost=0.00..861.76 rows=66992 width=10) -> Seq Scan on employeeterritories e (cost=0.00..22.70 rows=1264 width=4) Filter: ((territoryid)::"varchar" IS NOT NULL) -> Materialize (cost=0.00..1.79 rows=53 width=6) -> Seq Scan on territories t (cost=0.00..1.53 rows=53 width=6)

完成檢閱和調整查詢後,您可以關閉該函數,如下所示:

1> SET BABELFISH_SHOWPLAN_ALL OFF

將 BABELFISH_STATISTICS PROFILE 設定為 ON 的情況下,每個執行的查詢會傳回其一般結果集,接著傳回一個顯示實際查詢執行計劃的附加結果集。Babelfish 會產生查詢計劃,以在呼叫 SELECT 陳述式時提供最快的結果集。

1> SET BABELFISH_STATISTICS PROFILE ON 1> 2> GO 1> SELECT e.employeeid, t.territoryid FROM 2> dbo.employeeterritories e, dbo.territories t 3> WHERE t.territoryid=e.territoryid ORDER BY t.territoryid; 4> GO

傳回結果集和查詢計劃 (此範例僅顯示查詢計劃)。

QUERY PLAN --------------------------------------------------------------------------- Query Text: SELECT e.employeeid, t.territoryid FROM dbo.employeeterritories e, dbo.territories t WHERE t.territoryid=e.territoryid ORDER BY t.territoryid Sort (cost=42.44..43.28 rows=337 width=10) Sort Key: t.territoryid NULLS FIRST -> Hash Join (cost=2.19..28.29 rows=337 width=10) Hash Cond: ((e.territoryid)::"varchar" = (t.territoryid)::"varchar") -> Seq Scan on employeeterritories e (cost=0.00..22.70 rows=1270 width=36) -> Hash (cost=1.53..1.53 rows=53 width=6) -> Seq Scan on territories t (cost=0.00..1.53 rows=53 width=6)

若要進一步了解如何分析您的查詢及 PostgreSQL 最佳化工具傳回的結果,請參閱 explain.depesz.com。如需有關 PostgreSQL EXPLAIN 與 EXPLAIN ANALYZE 的詳細資訊,請參閱 PostgreSQL 文件中的 EXPLAIN

可控制 Babelfish 解釋選項的參數

您可以使用下表中顯示的參數控制查詢計劃顯示的資訊類型。

參數 描述

babelfishpg_tsql.explain_buffers

此布林值會開啟 (和關閉) 最佳化工具的緩衝區量資訊。(預設值:關閉) (允許值:關閉、開啟)

babelfishpg_tsql.explain_costs

此布林值會開啟 (和關閉) 最佳化工具的預估啟動和總成本資訊。(預設值:開啟) (允許值:關閉、開啟)

babelfishpg_tsql.explain_format

指定 EXPLAIN 計劃的輸出格式。(預設值:文字) (允許值:文字、xml、json、yaml)

babelfishpg_tsql.explain_settings

此布林值會開啟 (或關閉) 在 EXPLAIN 計劃輸出中包含組態參數的相關資訊。(預設值:關閉) (允許值:關閉、開啟)

babelfishpg_tsql.explain_summary

此布林值會開啟 (或關閉) 摘要資訊,例如查詢計劃後的總時間。(預設值:開啟) (允許值:關閉、開啟)

babelfishpg_tsql.explain_timing

此布林值會開啟 (或關閉) 實際啟動時間及在輸出的每個節點中花費的時間。(預設值:開啟) (允許值:關閉、開啟)

babelfishpg_tsql.explain_verbose

此布林值會開啟 (或關閉) 解釋計劃最詳細的版本。(預設值:關閉) (允許值:關閉、開啟)

babelfishpg_tsql.explain_wal

此布林值會開啟 (或關閉) WAL 記錄資訊的產生使其成為解釋計劃的一部分。(預設值:關閉) (允許值:關閉、開啟)

您可以透過使用 PostgreSQL 用戶端或 SQL Server 用户端,來檢查系統上任何 Babelfish 相關參數的值。請執行下列命令,以取得目前的參數值:

1> execute sp_babelfish_configure '%explain%'; 2> GO

在以下輸出中,您可以看到此特定 Babelfish 資料庫叢集上的所有設定均為其預設值。並非所有的輸出都會出現在此範例中。

name setting short_desc ---------------------------------- -------- -------------------------------------------------------- babelfishpg_tsql.explain_buffers off Include information on buffer usage babelfishpg_tsql.explain_costs on Include information on estimated startup and total cost babelfishpg_tsql.explain_format text Specify the output format, which can be TEXT, XML, JSON, or YAML babelfishpg_tsql.explain_settings off Include information on configuration parameters babelfishpg_tsql.explain_summary on Include summary information (e.g.,totaled timing information) after the query plan babelfishpg_tsql.explain_timing on Include actual startup time and time spent in each node in the output babelfishpg_tsql.explain_verbose off Display additional information regarding the plan babelfishpg_tsql.explain_wal off Include information on WAL record generation (8 rows affected)

您可以使用 sp_babelfish_configure 變更這些參數的設定,如下列範例所示。

1> execute sp_babelfish_configure 'explain_verbose', 'on'; 2> GO

如果您想要讓設定永久存在於整個叢集層級上,請包括關鍵字 server,如下列範例所示。

1> execute sp_babelfish_configure 'explain_verbose', 'on', 'server'; 2> GO