本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
評估查詢計畫
您可以使用查詢計劃來識別可將分佈樣式最佳化的候選者。
在做出初始設計決策之後,請建立資料表、將資料載入其中,然後測試它們。使用儘可能接近真實資料的測試資料集。測量載入時間做為比較的基準。
評估代表您預期執行之最昂貴查詢的查詢,特別是使用聯結和彙總的查詢。比較各種設計選項的執行階段。比較執行階段時,請勿計算第一次執行查詢的時間,因為第一個執行階段會包含編譯時間。
- DS_DIST_NONE
-
不需要重新分佈,因為對應配量是在運算節點上共置。您通常只有一個 DS_DIST_NONE 步驟,即事實資料表與一個維度資料表之間的聯結。
- DS_DIST_ALL_NONE
-
不需要重新分佈,因為內部資料表已使用 DISTSTYLE ALL。整個資料表位於每個節點上。
- DS_DIST_INNER
-
重新配送內部資料表。
- DS_DIST_OUTER
-
重新配送外部資料表。
- DS_BCAST_INNER
-
將整個內部資料表的副本播送至所有運算節點。
- DS_DIST_ALL_INNER
-
因為外部資料表使用 DISTSTYLE ALL,會將整個內部資料表重新配送至單一配量。
- DS_DIST_BOTH
-
重新配送這兩個資料表。
DS_DIST_NONE 和 DS_DIST_ALL_NONE 都是不錯的選擇。它們指出該步驟不需要重新分佈,因為所有聯結已共置。
DS_DIST_INNER 意味著該步驟的成本可能相對較高,因為內部表正在重新分配到節點。DS_DIST_INNER 指出外部資料表已適當地分佈在聯結索引鍵上。將內部資料表的分佈索引鍵設為聯結索引鍵,以將此項轉換為 DS_DIST_NONE。在某些情況下,無法在連接鍵上分發內部表,因為外部表不分佈在連接鍵上。如果是這種情況,請評估是否對內部表格使用 ALL 分佈。如果資料表未經常或廣泛地更新,且其大小足以承受較高的重新分配成本,請將發佈樣式變更為 ALL,然後再次測試。ALL 分佈會導致載入時間增加,因此當您重新測試時,請將載入時間併入您的評估因素中。
DS_DIST_ALL_INNER 不是好選擇。這意味著整個內部表被重新分配到單個切片,因為外部表使用 DISTSTYLE ALL,因此整個外部表的副本位於每個節點上。這會導致單個節點上的連接的串行運行時效率低下,而是利用使用所有節點的 parallel 運行時。DISTSTYLE ALL 主要只用於內部聯結資料表。反之,指定分佈索引鍵或甚至對外部資料表使用分佈。
DS_BCAST_INNER 和 DS_DIST_BOTH 不是好選擇。通常,這些重新分佈之所以發生,原因是未在資料表的分佈索引鍵上聯結資料表。如果事實資料表尚未有分佈索引鍵,請將聯結資料欄指定為這兩個資料表的分佈索引鍵。如果事實資料表在另一個資料行上已經有發佈索引鍵,請評估變更分發索引鍵以合併此聯結是否可改善整體效能。如果變更外部資料表的分配索引鍵不是最佳選擇,您可以透過為內部資料表指定 DISTSTYLE ALL 來實現搭配。
下列範例顯示具有 DS_BCAST_INNER 和 DS_DIST_NONE 標籤之查詢計劃的一部分。
-> XN Hash Join DS_BCAST_INNER (cost=112.50..3272334142.59 rows=170771 width=84) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Hash Join DS_BCAST_INNER (cost=109.98..3167290276.71 rows=172456 width=47) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Merge Join DS_DIST_NONE (cost=0.00..6286.47 rows=172456 width=30) Merge Cond: ("outer".listid = "inner".listid) -> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=14) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=24)
在變更維度資料表來使用 DISTSTYLE ALL 之後,相同查詢的查詢計劃便會顯示 DS_DIST_ALL_NONE 代替 DS_BCAST_INNER。另外,聯結步驟的相對成本會發生大幅變更。
-> XN Hash Join DS_DIST_ALL_NONE (cost=112.50..14142.59 rows=170771 width=84) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Hash Join DS_DIST_ALL_NONE (cost=109.98..10276.71 rows=172456 width=47) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Merge Join DS_DIST_NONE (cost=0.00..6286.47 rows=172456 width=30) Merge Cond: ("outer".listid = "inner".listid) -> XN Seq Scan on listing (cost=0.00..1924.97 rows=192497 width=14) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=24)