基於成本的優化¶
Presto 支援數種基於成本的優化,如下所述。
Join 列舉¶
查詢中 Join 執行的順序對於查詢效能有顯著影響。Join 排序對效能影響最大的方面是正在處理和透過網路傳輸的資料大小。如果在執行初期執行產生大量資料的 Join,則後續階段將需要處理比必要的時間更長的資料量,從而增加查詢所需的時間和資源。
透過基於成本的 Join 列舉,Presto 使用連接器提供的 表格統計資訊 來估計不同 Join 順序的成本,並自動選擇計算成本最低的 Join 順序。
Join 列舉策略由 join_reordering_strategy
會議屬性控管,而 optimizer.join-reordering-strategy
組態屬性則提供預設值。
- 有效值為
AUTOMATIC
(預設) - 啟用完全自動 Join 列舉ELIMINATE_CROSS_JOINS
- 消除不必要的交叉 JoinNONE
- 純語法 Join 順序
如果使用 AUTOMATIC
且統計資訊不可用,或由於任何其他原因而無法計算成本,則會改用 ELIMINATE_CROSS_JOINS
策略。
Join 分布選擇¶
Presto 使用基於雜湊的 Join 演算法。這表示對於每個 Join 運算子,都必須從一個 Join 輸入 (稱為建置端) 建立雜湊表。然後迭代另一個輸入 (探測端),並針對每一列查詢雜湊表以尋找符合的列。
- 有兩種 Join 分布類型
分割:參與查詢的每個節點僅從一部分資料建立雜湊表
廣播:參與查詢的每個節點從所有資料建立雜湊表 (資料會複製到每個節點)
每種類型都有其權衡取捨。分割的 Join 需要使用 Join 金鑰的雜湊重新分配兩個表格。這可能比廣播 Join 慢 (有時會慢很多),但允許更大的 Join。特別是,如果建置端比探測端小得多,則廣播 Join 會更快。但是,廣播 Join 需要在篩選後,Join 建置端的表格符合每個節點上的記憶體,而分散式 Join 僅需要在所有節點上的分散式記憶體中符合。
透過基於成本的 Join 分布選擇,Presto 會自動選擇是要使用分割還是廣播 Join。透過基於成本的 Join 列舉和基於成本的 Join 分布,Presto 會自動選擇哪一邊是探測端,哪一邊是建置端。
Join 分布類型由 join_distribution_type
會議屬性控管,而 join-distribution-type
組態屬性則提供預設值。
- 有效值為
AUTOMATIC
(預設) - 針對每個 Join 自動決定 Join 分布類型BROADCAST
- 將廣播 Join 分布用於所有 JoinPARTITIONED
- 將分割的 Join 分布用於所有 Join
限制複製表格大小¶
當 Join 重新排序策略設定為 COST_BASED
或當 Join 分布類型設定為 AUTOMATIC
時,將會自動選擇 Join 分布類型。在這種情況下,可以透過 join-max-broadcast-table-size
組態屬性 (例如 join-max-broadcast-table-size=100MB
) 或透過 join_max_broadcast_table_size
會議屬性 (例如 set session join_max_broadcast_table_size='100MB';
) 來限制複製表格的最大大小。這允許提高叢集並行性,並防止 CBO 錯誤估計 Join 表格大小時產生不良計畫。
依預設,複製表格大小上限為 100MB。
連接器實作¶
為了讓 Presto 最佳化器使用基於成本的策略,連接器實作必須提供 表格統計資訊。