針對最佳化器在某些情境下,很難準確估算表掃描行數、謂詞選擇率和執行計畫代價的情況,PolarDB MySQL版提供了自適應執行能力,支援根據真實的資料資訊自動調整執行計畫。本文介紹了自適應執行能力的背景資訊和使用說明等內容。
背景資訊
最佳化器會根據統計資訊和部分資料採樣資訊來做基數和估算選擇率,這些資訊可能因採樣精度、採樣方式等原因導致估算偏差較大。同時,還有廣泛的情境沒有相關的統計資訊,此時資料庫會根據經驗值或者某種數學假設去評估統計資訊,這可能會導致評估的值與實際值偏差較大。對於最佳化器估算與實際不符導致選錯執行計畫的情境,最佳化器難以預先收集對應的資訊。
若使用PolarDB MySQL版提供的列存索引(IMCI)功能,根據IMCI的行列分流方案,當執行查詢語句時,若最佳化器估算其在行存執行的代價估算偏低,此時可能會將某些慢查詢會路由到行存執行。
針對上述路由錯誤的問題,之前的解決方案如下:
調低路由到列存的代價閾值,此方案容易導致大量的短查詢路由到列存,從而導致列存負載太高,阻塞了其他查詢。
使用計劃固化 (Statement Outline)功能,將固定指定模板的查詢路由到列存,如通過添加以下樣本中的outline可以強制該查詢語句路由到列存執行。但該方式會導致營運成本大幅增加。
CALL dbms_outln.add_optimizer_outline("<Schema_name>", "/*+ SET_VAR(cost_threshold_for_imci=0) SET_VAR(imci_ap_threshold=0) */","<query>");
PolarDB MySQL版提供的自適應執行能力可以應用於行列路由中,將錯誤路由到行存的慢查詢自動切換到列存執行,以保證執行效率。
技術原理
通過自適應執行能力,資料庫會在最佳化階段將查詢中各個查詢塊(Query block)和整體的掃描資料行數加入到監控資訊中,如果查詢語句在代價計算後沒有選擇列存,最佳化器會計算觸發自適應執行能力的閾值。在執行階段,當查詢塊(Query block)或整體的掃描資料行數觸發了計算的自適應執行能力的閾值,執行器會判斷是否切換到列存執行。切換到列存前,最佳化器會保證行存的執行結果集沒有返回給用戶端,並且切換到列存執行後,PolarDB會清空已緩衝的行存結果集。
使用前提
叢集版本需為PolarDB MySQL版8.0.1版本,且修訂版本為8.0.1.1.39及以上。
使用說明
開啟或關閉自適應執行能力
您可以登入PolarDB控制台。在目的地組群的參數配置頁面將參數loose_adaptive_plans_switch
的值設定為'imci_chosen=on'
來開啟自適應執行能力。設定參數值的具體操作請參見設定叢集參數和節點參數,使用自適應執行能力時涉及的具體參數見下表。
參數名稱 | 層級 | 參數說明 |
loose_adaptive_plans_switch | Global/Session | 自適應執行能力控制開關。取值範圍如下:
|
loose_adaptive_plans_max_time | Global/Session | 允許切換自適應執行能力的SQL語句已執行時間的最大值。即當查詢語句在原計劃的執行時間超過該時間後,即使觸發切換計劃閾值,也不再切換執行計畫。 取值範圍:0~1800000。預設值為500。單位為毫秒。 |
查看自適應切換執行計畫的次數
您可以在資料庫中執行以下SQL語句,來查看從開啟自適應執行能力開始,截止到目前的自適應切換執行計畫的次數。
SHOW GLOBAL STATUS LIKE 'Adaptive_plan_used';
其中,變數Adaptive_plan_used
說明如下:
變數名稱 | 層級 | 變數說明 |
Adaptive_plan_used | Global | 從開啟自適應執行能力開始,截止到目前的自適應切換執行計畫的次數。 |