基於成本的優化

Presto 支援數種基於成本的優化,如下所述。

Join 列舉

查詢中 Join 執行的順序對於查詢效能有顯著影響。Join 排序對效能影響最大的方面是正在處理和透過網路傳輸的資料大小。如果在執行初期執行產生大量資料的 Join,則後續階段將需要處理比必要的時間更長的資料量,從而增加查詢所需的時間和資源。

透過基於成本的 Join 列舉,Presto 使用連接器提供的 表格統計資訊 來估計不同 Join 順序的成本,並自動選擇計算成本最低的 Join 順序。

Join 列舉策略由 join_reordering_strategy 會議屬性控管,而 optimizer.join-reordering-strategy 組態屬性則提供預設值。

有效值為
  • AUTOMATIC (預設) - 啟用完全自動 Join 列舉

  • ELIMINATE_CROSS_JOINS - 消除不必要的交叉 Join

  • NONE - 純語法 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 分布用於所有 Join

  • PARTITIONED - 將分割的 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 最佳化器使用基於成本的策略,連接器實作必須提供 表格統計資訊