

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

# 了解 Athena EXPLAIN 陳述式結果
<a name="athena-explain-statement-understanding"></a>

本主題提供 Athena `EXPLAIN` 陳述式結果中使用的操作術語的簡要指南。

## EXPLAIN 陳述式輸出類型
<a name="athena-explain-statement-understanding-explain-plan-types"></a>

`EXPLAIN` 陳述式輸出可為以下兩種類型之一：
+ **邏輯計劃** – 顯示 SQL 引擎用來執行陳述式的邏輯計劃。此選項的語法為 `EXPLAIN` 或 `EXPLAIN (TYPE LOGICAL)`。
+ **分散式計劃** – 顯示分散式環境中的執行計劃。輸出顯示片段，這是處理階段。每個計劃片段會由一或多個節點處理。資料可以在處理片段的節點之間進行交換。此選項的語法為 `EXPLAIN (TYPE DISTRIBUTED)`。

  在分散式計畫的輸出中，用 `Fragment` {{number}} [{{fragment\_type}}] 表示片段 (處理階段)，其中 {{number}} 是一個以零為起始的整數，以及 {{fragment\_type}} 指定片段如何由節點執行。片段類型提供資料交換配置的深入資訊，如下表所述。  
**分散式計劃片段類型**    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/athena-explain-statement-understanding.html)

## Exchange
<a name="athena-explain-statement-understanding-exchange-types"></a>

交換相關術語描述如何在工作節點之間交換資料。傳輸可以是本機或遠端。

**LocalExchange [{{exchange\_type}}] **  
針對查詢的不同階段，在工作節點內本機傳輸資料。{{exchange\_type}} 的值可以是邏輯或分散式交換類型其中一種，如本節後文所述。

**RemoteExchange [{{exchange\_type}}] **  
針對查詢的不同階段，在工作節點之間傳輸資料。{{exchange\_type}} 的值可以是邏輯或分散式交換類型其中一種，如本節後文所述。

### 邏輯 Exchange 類型
<a name="athena-explain-statement-understanding-exchange-types-logical"></a>

下列交換類型說明邏輯計劃的交換階段期間所採取的動作。
+ **`GATHER`** – 單一工作節點會收集所有其他工作節點的輸出。例如，選取查詢的最後階段會收集所有節點的結果，並將結果寫入 Amazon S3。
+ **`REPARTITION`** – 根據套用至下一個運算子所需的分割結構描述，將資料行資料傳送至特定工作者。
+ **`REPLICATE`** – 將資料行資料複製到所有工作者。

### 分散式交換類型
<a name="athena-explain-statement-understanding-exchange-types-distributed"></a>

下列交換類型指出在分散式計劃中的節點之間交換資料時的資料配置。
+ **`HASH`** – 交換會使用雜湊函數將資料分配到多個目的地。
+ **`SINGLE`** – 交換會將資料分配到單一目的地。

## 掃描
<a name="athena-explain-statement-understanding-scanning"></a>

下列術語描述查詢期間如何掃描資料。

**TableScan **  
掃描來自 Amazon S3 或 Apache Hive 連接器的資料表來源資料，並套用從篩選述詞產生的分割區剔除。

**ScanFilter **  
掃描來自 Amazon S3 或 Hive 連接器的資料表來源資料，並套用從篩選述詞產生的分割區剔除，以及從沒有透過分割區剔除套用的其他篩選述詞產生的分割區剔除。

**ScanFilterProject **  
首先，掃描來自 Amazon S3 或 Hive 連接器的資料表來源資料，並套用從篩選述詞產生的分割區剔除，以及從沒有透過分割區剔除套用的其他篩選述詞產生的分割區剔除。然後，將輸出資料的記憶體配置修改為新的投影，以改善後續階段的效能。

## Join
<a name="athena-explain-statement-understanding-join"></a>

聯結兩個資料表之間的資料。聯結可以依聯結類型和分佈類型來分類。

### 聯結類型
<a name="athena-explain-statement-understanding-join-types"></a>

聯結類型定義聯結操作發生的方式。

**CrossJoin** – 產生已聯結的兩個資料表的笛卡兒乘積。

**InnerJoin** – 選取兩個資料表中具有相符值的記錄。

**LeftJoin** – 選取左資料表中的所有記錄，以及右資料表中的相符記錄。如果沒有發生匹配，右側的結果是 NULL。

**RightJoin** – 選取右資料表中的所有記錄，以及左資料表中的相符記錄。如果沒有發生匹配，左側的結果是 NULL。

**FullJoin** – 選取左側或右側資料表記錄中有相符項目的所有記錄。聯結資料表包含來自兩個資料表的所有記錄，並在兩側不符的地方以 NULL 填充。

**注意**  
基於效能考量，查詢引擎可以將聯結查詢重新寫入不同的聯結類型，以產生相同的結果。例如，在一個資料表上具有述詞的內部聯結查詢可以重寫入 `CrossJoin`。這會將述詞推送到資料表的掃描階段，以便掃描較少的資料。

### 聯結分佈類型
<a name="athena-explain-statement-understanding-join-distribution-types"></a>

分佈類型定義執行聯結操作時，如何在工作節點之間交換資料。

**已分割** – 左側和右側資料表會在所有工作節點間進行雜湊分割。已分割分佈會在每個節點消耗較少的記憶體。已分割分佈可以比複寫的聯結慢得多。當您聯結兩個大資料表時適合使用已分割聯結。

**已複寫** – 一個資料表會在所有工作節點之間進行雜湊分割，另一個資料表會複寫到所有工作節點，以執行聯結操作。複寫的分佈可以比已分割聯結快得多，但它會在每個工作節點中耗用更多的記憶體。如果複寫的資料表太大，工作節點可能會遇到記憶體不足錯誤。當其中一個聯結的資料表很小時，就適合使用複寫的聯結。