本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
評估查詢計畫
您可以使用查詢計劃來識別可將分佈樣式最佳化的候選者。
在做出初始設計決策之後,請建立資料表、將資料載入其中,然後測試它們。使用儘可能接近真實資料的測試資料集。測量載入時間做為比較的基準。
評估哪些查詢代表您預期執行成本最高的查詢,尤指使用聯結和彙總的查詢。比較各種設計選項的執行期。比較執行期時,請不要將第一次執行查詢的時間列入計算,因為第一次執行期包含編譯時間。
- 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和 DSDIST__ALL_ NONE很好。它們指出該步驟不需要重新分佈,因為所有聯結已共置。
DS_DIST_INNER 表示因為內部資料表正在重新分發給節點,所以步驟的成本可能相對較高。DS_DIST_INNER 表示外部資料表已正確分佈在聯結金鑰上。將內部資料表的分發金鑰設定為聯結金鑰,以將其轉換為 DS_DIST_NONE。在某些情況下,無法在聯結索引鍵上分佈內部資料表,因為外部資料表不會在聯結索引鍵上分佈。如果是這種情況,請評估是否使用內部資料表的ALL分佈。如果資料表未頻繁或大量更新,且其大小足以負擔高重新分佈成本,請將分佈樣式變更為 ALL,然後再次測試。ALL 分佈會導致載入時間增加,因此當您重新測試時,請在評估因素中包含載入時間。
DS_DIST_ALL_INNER 不好。這表示整個內部資料表會重新分發給單一切片,因為外部資料表使用 DISTSTYLE ALL,因此整個外部資料表的副本會位於每個節點上。這會在單一節點上造成一連串無效的聯結執行期,而不是使用所有節點來善用平行執行期。DISTSTYLE ALL 僅適用於內部聯結表。反之,指定分佈索引鍵或甚至對外部資料表使用分佈。
DS_BCAST_ INNER和 DS_DIST_BOTH 不好。通常,這些重新分佈之所以發生,原因是未在資料表的分佈索引鍵上聯結資料表。如果事實資料表尚未有分佈索引鍵,請將聯結資料欄指定為這兩個資料表的分佈索引鍵。如果事實資料表已在另一個資料欄上具有分佈索引鍵,則請評估變更分佈索引鍵來共置此聯結是否將改善整體效能。如果變更外部資料表的分佈索引鍵不是最佳選擇,您可以透過DISTSTYLEALL為內部資料表指定 來實現錯位。
下列範例顯示具有 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_DISTALL_NONE 取代 DS_BCAST_INNER。另外,聯結步驟的相對成本會發生大幅變更。與之前查詢中的 3272334142.59
相比,總成本是 14142.59
。
-> 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)