openGauss資料庫原始碼解析——慢SQL檢測

openGaussbaby發表於2024-04-08

openGauss 資料庫原始碼解析——慢 SQL 檢測
慢 SQL 檢測的定義:
基於歷史 SQL 語句資訊進行模型訓練,並用訓練好的模型進行 SQL 語句的預測,利用預測結果判斷該 SQL 語句是否是潛在的慢 SQL。當發現潛在的慢 SQL 後,開發者便可以進行針對性最佳化或者風險評估,以防業務上線後發生問題。

慢 SQL 檢測的功能:
上線業務預檢測:上線一批新業務前,使用 SQL 診斷功能評估此次上線業務的預估執行時長,便於使用者參考是否應該修改上線業務。workload 分析:能夠對現有 workload 進行分析,將現有 workload 自動分為若干類別,並依次分析此類別 SQL 語句執行代價,以及各個類別之間的相似程度。

首先,明確一下慢 SQL 發現的幾個不同階段,及其對應解決的問題。
階段 1:對使用者輸入的一批業務 SQL 語句進行分析,推斷 SQL 語句執行時間的快慢,進而可以將評估為慢 SQL 的語句識別出來。

階段 2:對識別出的潛在慢 SQL 進行根因診斷,判斷這些 SQL 語句是因為什麼慢,例如比較常見的原因可能是資料量過大、SQL 語句自身過於複雜、容易產生併發的鎖衝突、沒有建立索引導致全表掃描等等。

階段 3:對於已經識別出來的慢 SQL 語句的可能問題源,給出針對性的解決方案,譬如可以提示使用者進行 SQL 語句的改寫、建立索引等。

目前 openGauss 已具備階段 1 的能力,正在推進階段 2 能力,同時釋出了部分階段 3 的能力,如索引推薦功能。業內對於上述第一階段的主要實現方法大部分是透過執行計劃進行估計的,第二階段大多是透過構建故障模式庫、透過啟發式規則來實現的,有了上述前兩個階段的準備,第三階段的實現往往是比較獨立的。學術界對於第一階段的研究比較多,第二階段採用常規的構建故障模式庫的方法實現已經能取得比較好的效果了,因此並不是研究的熱點,而第三階段的工作又相對獨立,可以單獨作為一個領域進行研究。

基於執行計劃的 DNN 模型:
功能流程:

該演算法是將執行計劃中的運算元資訊輸入到深度學習網路中,從而對執行時間進行預測的。對於每個運算元,收集左右子樹的向量化特徵、最佳化器代價及執行時間,輸入與之對應的模型中,預測該運算元的向量化特徵及執行時間等。上述過程是個自底向上的過程。

例如——Join 操作預測流程
該流程圖顯示了一個 join 操作的預測流程,其左右子樹均為 Scan 運算元,將兩個 Scan 運算元透過對應的模型預測出的向量化特徵、執行時間,以及該 join 運算元的最佳化器評估代價作為入參,輸出 join 運算元模型得到該操作的向量化特徵及預測出的執行時間。

上述技術的缺點。
(1) 需要透過已預測運算元不斷修正模型,預測過程會較慢。
(2) 對環境變化感知差,如資料庫引數變化會使得原模型幾乎完全失效。
(3) 預測過程依賴待測語句的執行計劃,加重了資料庫的負荷,對於 OLTP 場景格外不適用。

基於執行計劃的 MART(multiple additive regression trees,多重累加回歸樹)模型,主要包含離線訓練模組和線上預測模組。他們的功能如下所示。
離線訓練階段:針對資料庫每種型別的運算元(如 Table Scan,Merge Join,Sort…),分別訓練其對應的模型,用於估算此運算元的開銷。此外,使用單獨的訓練階段,可為不同的運算元選擇適當的縮放函式。最後,形成帶縮放函式的不同的迴歸樹模型。

線上預測階段:計算出執行計劃中所有運算元的特徵值。然後,使用特徵值為運算元選擇合適的模型,並使用它來估算執行時間。

功能流程:
基於執行計劃 MART 模型技術調優技術的缺點。
1.泛用性較差,強依賴訓練好的運算元模型,遇到例如使用者自定義函式的未知語句時,預測效果會較差。

2.縮放函式依賴於先驗結果,對於超出範圍的特徵值效果無法保證。

3.預測過程依賴待測語句的執行計劃,加重了資料庫的負荷,很難推廣到 OLTP 場景中。

慢 SQL 檢測採取的策略:
基於 SQL 模板化的流程
基於 SQL 模板化的流程類似於基於執行計劃 MART 模型技術調優技術,他的具體流程如下:
1.獲取 SQL 流水資料。

2.檢測本地是否存在對應例項的歷史模板資訊,如果存在,則載入該模板資訊,如果不存在,則對該模板進行初始化。

3.基於 SQL 資料,提取 SQL 的粗粒度模板資訊。粗粒度模板表示將 SQL 中表名、列名和其他敏感資訊去除之後的 SQL 語句模板,該模板只保留最基本的 SQL 語句骨架。

4.基於 SQL 資料,提取 SQL 細粒度的模板資訊。細粒度模板表示在粗粒度模板資訊的基礎上保留表名、列名等關鍵資訊的 SQL 語句模板。細粒度模板相對粗粒度模板保留了更多 SQL 語句的資訊。

5.執行訓練過程時,首先構造 SQL 語句的基於粗粒度模板和細粒度模板資訊,例如粗粒度模板 ID、執行平均時間、細模板執行時間序列、執行平均時間和基於滑動視窗計算出的平均執行時間等。最後將上述模板資訊進行儲存。

6.執行預測過程時,首先匯入對應例項的模板資訊,如果不存在該模板資訊,則直接報錯退出;否則繼續檢測是否存在該 SQL 語句的粗粒度模板資訊,如果不存在,則基於模板相似度計算方法在所有粗粒度模板裡面尋找最相似的 N 條模板,之後基於 KNN(K 近鄰)演算法預測出執行時間;如果存在粗粒度模板,則接著檢測是否存在近似的細粒度模板,如果不存在,則基於模板相似度計算方法在所有細粒度模板裡面尋找最相似的 N 條模板,之後基於 KNN 預測出執行時間;如果存在匹配的細粒度模板,則基於當前模板資料,直接返回對應的執行時間。

實現程式碼:
基於深度學習的執行流程
1.獲取 SQL 流水。

2.在訓練過程中,首先判斷是否存在歷史模型,如果存在,則匯入模型進行增量訓練;如果不存在歷史模型,則首先利用 word2vector 演算法對 SQL 語句進行向量化,即圖 8-11 中的 SQL embeding 過程。而後建立深度學習模型,將該 SQL 語句向量化的結果作為輸入特徵。基於訓練資料進行訓練,並將模型儲存到本地。值得一提的是,該深度學習模型的最後一個全連線層網路的輸出結果作為該 SQL 語句的特徵向量。

3.在預測過程中,首先判斷是否存在模型,如果模型不存在,則直接報錯退出;如果存在模型,則匯入模型,並利用 word2vector 演算法將待預測的 SQL 語句進行向量化,並將該向量輸入到深度學習網路中,獲取該神經網路的最後一個全連線層的輸出結果,即為該 SQL 語句的特徵向量。最後,利用餘弦相似度在樣本資料集中進行尋找,找到相似度最高的 SQL 語句,將該結果返回即為該待預測 SQL 語句的預估執行時間。當然,如果是基於最新 SQL 語句執行時間資料集訓練出的深度學習模型,則模型的迴歸預測結果也可以作為預估執行時間。

實現程式碼:
總體流程程式碼解析
參考文章:Gauss 松鼠會原始碼解析

相關文章