ApsaraDB for SelectDB支援全新最佳化器Nereids。相比於舊版最佳化器,新最佳化器可以更好的支援多表Join查詢,多層子查詢嵌套等更為複雜的查詢。此外,它減少了最佳化規則出現邏輯錯誤的可能性,並且便於擴充最佳化規則和處理階段,能夠更穩定、迅速地響應業務需求。
功能簡介
當下,現代查詢最佳化工具面臨著更加複雜的查詢語句和更加多樣化的查詢情境等挑戰。與此同時,使用者對於儘快獲得查詢結果的需求也日益迫切。SelectDB舊版最佳化器的架構陳舊,難以滿足今後快速迭代的需要。
因此,ApsaraDB for SelectDB團隊推出了一款現代架構的全新查詢最佳化工具Nereids。Nereids最佳化器針對當前SelectDB情境的查詢請求進行了高效最佳化,提升了處理效能,同時展現出優秀的擴充性,這為其應對未來更複雜的查詢需求和進一步的系統擴充打下了堅實的基礎。
Nereids最佳化器特點
更智能
Nereids最佳化器以規則的形式呈現每個基於規則的最佳化(RBO)和基於成本的最佳化(CBO)的最佳化點。對於每一個規則,Nereids最佳化器都提供了一組用於描述查詢計劃形狀的模式,可以精確匹配可最佳化的查詢計劃。因此,Nereids最佳化器可以更好的支援諸如多層子查詢嵌套等更為複雜的查詢語句。
Nereids最佳化器的CBO基於先進的Cascades架構,使用了更為豐富的資料統計資訊,並應用了維度更科學的代價模型,使得Nereids最佳化器在處理多表Join查詢時,更加得心應手。
如下是新舊版最佳化器在TPC-H SF100下的查詢速度比較,其中測試環境為3個BE(叢集)節點,每個節點16 core 64 GB記憶體。新最佳化器使用標準測試中的原始SQL,執行SQL前收集了統計資訊。舊最佳化器使用原始SQL和手工調優的SQL。可以觀察到,在無需手動最佳化查詢的情況下,新的最佳化器的總體查詢效能接近於經過手動最佳化的舊最佳化器,遠遠超過了舊最佳化器在原始SQL下的效能。

更健壯
Nereids最佳化器的所有最佳化規則,均在邏輯執行計畫樹上完成。在一個查詢的文法語義解析完成後,便將其轉換為一棵樹狀結構。這種結構相比於舊最佳化器的內部資料結構更為合理和統一。以子查詢處理為例,Nereids最佳化器基於新的資料結構,避免了舊最佳化器中眾多規則對子查詢的單獨處理,從而減少了最佳化規則出現邏輯錯誤的可能。
更靈活
Nereids最佳化器的架構設計更優雅合理,可以方便地擴充最佳化規則和處理階段,能夠更迅速的響應使用者的新需求。
使用方法
開啟新最佳化器。
說明當前已預設開啟。
SET enable_nereids_planner=true;開啟自動回退到舊最佳化器:
SET enable_fallback_to_original_planner=true;
為了能夠充分利用新最佳化器的CBO能力,建議對關注查詢效能的表執行ANALYZE語句,以收集更豐富的統計資訊。詳情請參見統計資訊。
注意事項
暫不支援的功能
如果開啟了自動回退,則在新最佳化器出現問題的場合,會自動回退到舊最佳化器執行。
不支援JSON、Array、Map、Struct 類型:查詢的表含有這些類型,或者查詢中的函數會輸出這些類型時,不支援Nereids最佳化器。
僅支援的DML:
INSERT INTO SELECT、UPDATE、DELETE。帶過濾條件的物化視圖。
別名函數。
Java UDF和HDFS UDF。
高並發點查詢最佳化。
已知問題
不支援命中Partition Cache。