

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

# 使用解釋計劃改善 Babelfish 查詢效能
<a name="working-with-babelfish-usage-notes-features.using.explain"></a>

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

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

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


|  SQL Server  | Babelfish  | PostgreSQL  | 
| --- | --- | --- | 
| SHOWPLAN\$1ALL  | BABELFISH\$1SHOWPLAN\$1ALL  | EXPLAIN  | 
| STATISTICS PROFILE  | BABELFISH\$1STATISTICS PROFILE  | 解釋分析  | 
| 使用 SQL Server 最佳化工具  | 使用 PostgreSQL 最佳化工具  | 使用 PostgreSQL 最佳化工具  | 
| SQL Server 輸入與輸出格式  | SQL Server 輸入與 PostgreSQL 輸出格式  | PostgreSQL 輸入和輸出格式  | 
| 為工作階段設定  | 為工作階段設定  | 套用至特定陳述式  | 
| 支援以下項目： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/working-with-babelfish-usage-notes-features.using.explain.html)  | 支援以下項目： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/working-with-babelfish-usage-notes-features.using.explain.html)  | 支援以下項目： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/working-with-babelfish-usage-notes-features.using.explain.html)  | 

按照下列方式使用 Babelfish 函數：
+ SET BABELFISH\$1SHOWPLAN\$1ALL [ON\$1OFF] – 設定 ON 以產生預估的查詢執行計劃。此函數會實作 PostgreSQL `EXPLAIN` 命令的行為。使用此命令可取得給定查詢的解釋計劃。
+ SET BABELFISH\$1STATISTICS PROFILE [ON\$1OFF] – 設定為 ON 以取得實際查詢執行計劃。這個函數實作 PostgreSQL 其 `EXPLAIN ANALYZE` 命令的行為。

如需有關在 PostgreSQL `EXPLAIN` 和 `EXPLAIN ANALYZE` 的詳細資訊，請參閱 PostgreSQL 文件中的 [EXPLAIN](https://www.postgresql.org/docs/current/sql-explain.html)。

**注意**  
從 2.2.0 版開始，您可以將 `escape_hatch_showplan_all` 參數設為 *ignore*，以避免在 SQL Server 語法中將 *BABELFISH\$1* 字首用於 `SHOWPLAN_ALL` 和 `STATISTICS 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\$1STATISTICS 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](https://www.depesz.com/2013/04/16/explaining-the-unexplainable/)。如需有關 PostgreSQL EXPLAIN 與 EXPLAIN ANALYZE 的詳細資訊，請參閱 PostgreSQL 文件中的 [EXPLAIN](https://www.postgresql.org/docs/current/sql-explain.html)。

## 可控制 Babelfish 解釋選項的參數
<a name="working-with-babelfish-usage-notes-features.using.explain.parameters"></a>

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


| 參數 | 描述 | 
| --- | --- | 
| babelfishpg\$1tsql.explain\$1buffers | 此布林值會開啟 (和關閉) 最佳化工具的緩衝區量資訊。(預設值：關閉) (允許值：關閉、開啟)  | 
| babelfishpg\$1tsql.explain\$1costs | 此布林值會開啟 (和關閉) 最佳化工具的預估啟動和總成本資訊。(預設值：開啟) (允許值：關閉、開啟)  | 
| babelfishpg\$1tsql.explain\$1format | 指定 `EXPLAIN` 計劃的輸出格式。(預設值：文字) (允許值：文字、xml、json、yaml)  | 
| babelfishpg\$1tsql.explain\$1settings | 此布林值會開啟 (或關閉) 在 EXPLAIN 計劃輸出中包含組態參數的相關資訊。(預設值：關閉) (允許值：關閉、開啟)  | 
| babelfishpg\$1tsql.explain\$1summary | 此布林值會開啟 (或關閉) 摘要資訊，例如查詢計劃後的總時間。(預設值：開啟) (允許值：關閉、開啟)  | 
| babelfishpg\$1tsql.explain\$1timing | 此布林值會開啟 (或關閉) 實際啟動時間及在輸出的每個節點中花費的時間。(預設值：開啟) (允許值：關閉、開啟)  | 
| babelfishpg\$1tsql.explain\$1verbose | 此布林值會開啟 (或關閉) 解釋計劃最詳細的版本。(預設值：關閉) (允許值：關閉、開啟)  | 
| babelfishpg\$1tsql.explain\$1wal | 此布林值會開啟 (或關閉) 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
```