引數化查詢是一類具有相同模板且僅在謂詞繫結引數上有所不同的查詢,它們在現代資料庫應用程式中被廣泛使用。 他們執行重複的動作,這提供了優化其效能的機會。
然而,許多當前的商業資料庫通過簡單地優化查詢中的第乙個查詢例項(或使用者指定的例項)來處理引數化查詢,快取其最佳計畫並將其重用於後續查詢例項。 雖然該方法的優化時間最小化,但由於不同查詢例項的最優計畫不同,快取計畫的執行可能會任意次優,這在實際應用場景中並不適用
大多數傳統的優化方法都需要對查詢優化器進行許多假設,但這些假設通常不適合實際場景。 幸運的是,隨著機器學習的興起,這些問題可以得到有效的解決。 本期我們將重點介紹發表在VLDB2022和SIGMOD2023上的兩篇文章
:《leveraging query logs and machine learning for parametric query optimization》
:《kepler: robust learning for faster parametric query optimization》
** 1 亮點
本文將引數化查詢優化解耦為兩個問題:
1) populatecache:快取查詢模板的 k 個計畫;
2) getplan:對於每個查詢例項,從快取計畫中選擇最佳計畫。
本**的演算法架構如下圖所示。 有兩個主要模組:populatecache 和 getplan 模組。
PopulateCache 使用查詢日誌中的資訊來快取所有查詢例項的 K 個計畫。 GetPlan 模組首先通過與優化器互動來收集 k 個計畫例項和查詢例項之間的成本資訊,並使用此資訊來訓練機器學習模型。 在 DBMS 中部署經過訓練的模型。 當查詢例項到達時,可以快速確定例項的最佳計畫。
PolulateCache 模組負責為給定的引數化查詢標識一組快取計畫,搜尋階段使用兩個優化器 API:
優化器呼叫:返回優化器為查詢例項選擇的計畫;
recost call:返回查詢例項的優化器預估成本和對應的計畫;
演算法流程如下:
plan-collection phase:呼叫優化器呼叫,收集查詢日誌中 n 個查詢例項的候選計畫;
計畫-重計費用階段:對每個查詢例項和每個候選計畫呼叫重計費用呼叫,以形成計畫-重計費用矩陣。
k-set 識別階段:貪婪演算法用於使用計畫-重計費矩陣快取 k 個計畫,以最小化次樂觀。
getplan 模組負責為給定的查詢例項選擇乙個快取的 k 個計畫來執行。 GetPlan 演算法可以考慮兩個目標:最小化優化器估計的成本,或最小化 k 個快取計畫實際執行的成本。
考慮目標 1:使用計畫-重成本矩陣訓練監督式 ML 模型,同時考慮分類和回歸。
考慮目標 2:使用基於多臂強盜的強化學習來訓練模型。
** 2 亮點
該文提出一種端到端的、基於學習的引數化查詢優化方法,旨在減少查詢優化時間,提高查詢執行效能。
克卜勒還將問題解耦為兩部分:計畫生成和基於學習的計畫預測。 有三個主要階段:計畫生成策略、訓練查詢執行階段和魯棒神經網路模型。
如上圖所示,查詢日誌中的查詢例項輸入給 Kepler Trainer,Kepler Trainer 首先生成乙個候選計畫,然後收集與候選計畫相關的執行資訊,將其作為訓練資料來訓練機器學習模型,訓練後將模型部署到 DBMS 中。 當查詢例項到達時,使用 kepler 客戶端進行最佳計畫和執行。
在本文中,我們提出了一種稱為行計數演變(RCE)的候選計畫生成演算法,該演算法通過擾動優化器的基數估計來生成候選計畫。
該演算法的思想是,基數的錯誤估計是優化器次優的主要原因,候選計畫生成階段只需要包含乙個例項的最優計畫,而不是選擇單個最優計畫。
RCE演算法首先為查詢例項生成最優計畫,然後在指數區間範圍內擾動其子計畫的連線基數,多次重複,多次迭代,最後將所有生成的計畫選為候選計畫。 具體示例如下:
使用 RCE 演算法,生成的候選計畫可能會優於優化器生成的候選計畫。 由於優化器可能存在基數估計誤差,因此 RCE 通過不斷擾動基數估計來生成正確基數的最佳計畫。
獲得候選計畫集後,將對每個查詢例項的工作負載執行每個計畫,並收集真實執行時間以訓練監督最優計畫模型。 上述過程比較繁瑣,本文提出了一些加速訓練資料採集的機制,如併行執行和自適應超時機制。
使用生成的真實執行資料訓練神經網路,以便為每個查詢例項進行最佳規劃。 其中使用的神經網路是高斯神經過程的譜歸一化,保證了網路的穩定性和訓練的收斂性,可以為世界提供不確定性估計。 當不確定性估計值大於某個閾值時,由優化器選擇執行計畫。 在一定程度上避免了效能回歸。
總結
以上兩者都將引數化查詢解耦為兩部分,即 populatecache 和 getplan。 兩者的比較如下表所示。
基於機器學習模型的演算法在規劃方面表現良好,但其訓練資料收集過程成本高昂,且模型不易泛化和更新。 因此,現有的引數化查詢優化方法仍有一定的改進空間。
本文圖解**:
1)kapil vaidya & anshuman dutt, 《leveraging query logs and machine learning for parametric query optimization》, 2022 vldb,2)lyric doshi & vincent zhuang, 《kepler: robust learning for faster parametric query optimization》, 2023 sigmod,