

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

# EXPLAIN Amazon Redshift 查詢計畫的資料重新分佈
<a name="explain-redistribution"></a>

在聯結步驟期間，配量可能需要使用未存放在本機的資料，而網路傳輸 （運算節點之間的資料移動） 是最昂貴的查詢操作。

聯結的`EXPLAIN`輸出也會指定在叢集周圍移動資料的方法，以促進聯結。資料可以透過播送或重新配送來移動。
+ 在播送中，來自聯結一端的資料值會從每個運算節點複製到每個其他運算節點，使得每個運算節點最終有完整的資料副本。
+ 在重新配送中，參與的資料值是從其目前的配量傳送至新配量 (可能在不同的節點上)。資料一般會重新配送以符合參與聯結的其他資料表的散發索引鍵 (如果該散發索引鍵是其中一個聯結資料欄)。如果任何資料表都不具備其中一個聯結資料欄上的散發索引鍵，則會配送兩個資料表，或是將內部資料表播送至每個節點。

`EXPLAIN` 輸出也會參考內部和外部資料表。
+ 首先掃描內部資料表，並出現在查詢計畫底部附近。內部資料表是用於探測建置資料表中相符資料列的資料表。通常，記憶體中保留的內部資料表是雜湊的來源資料表，如果可能，則是兩個聯結的較小資料表。
+ 外部資料表是要比對內部資料表的資料列來源，通常從磁碟讀取。查詢最佳化工具會根據`ANALYZE`命令最新執行的資料庫統計資料，選擇內部和外部資料表。查詢子`FROM`句中的資料表順序不會決定哪個資料表是內部資料表和哪個資料表是外部資料表。

請在查詢計畫中使用下列屬性來識別資料將移動的方式，以輔助查詢：
+ **DS\_BCAST\_INNER** – 表示整個內部聯結資料表的副本正在廣播至所有運算節點。
+ **DS\_DIST\_ALL\_NONE** – 不需要重新分佈，因為內部資料表已使用 分佈到每個節點`DISTSTYLE ALL`。整個資料表位於每個運算節點上。
+ **DS\_DIST\_NONE** – 不需要重新分佈，因為對應的配量會共置在運算節點上。這是最有效率的選項，因為沒有網路傳輸。
+ **DS\_DIST\_INNER** – 表示重新分配內部聯結資料表。如果內部資料表更小或不常更新，請考慮將該資料表變更為 `DISTSTYLE ALL`。
+ **DS\_DIST\_OUTER** – 表示重新分配外部聯結資料表。如果外部資料表更小或不常更新，請考慮將該資料表變更為 `DISTSTYLE ALL`。
+ **DS\_DIST\_ALL\_INNER** – 指出內部聯結資料表正在傳送至單一節點，因為聯結資料表使用 `DISTSTYLE ALL`。此聯結會在單一節點上執行，而且可能會很慢。
+ **DS\_DIST\_BOTH** – 表示聯結中的兩個資料表正在重新分發至所有節點。這是最差的可能選項。