SQL最佳化技術能夠自動檢測並分析資料庫中的慢查詢問題,識別出執行效率低下的SQL語句。通過深入分析這些SQL的執行計畫,技術會提出改進建議或直接進行最佳化,比如重寫SQL語句、調整索引使用等,以減少查詢時間,降低資源消耗。
背景資訊
作為資料庫管理員或應用開發人員,都有SQL最佳化需求,但是資料庫上執行的SQL千差萬別,且伴隨著業務快速迭代、資料分布特徵變化、熱點變化、資料庫版本升級等持續動態變化,這些都使得SQL最佳化需要投入大量的人力物力。
挑戰
精準性:如何構建異常檢測機制,實現最佳化時機的精準識別,問題SQL的精準定位。
專業性:需要強大的專業性最佳化診斷後盾,沒有有效專業診斷,最佳化就無從談起。
安全性:線上無小事,線上變更如何做到安全可控。
全面性:最佳化效果的全面多維度跟蹤,全面即時評估,也是保證安全性的要求。
聯動性:對於複雜的線上問題,有時需要綜合治理,如突發的惡性慢SQL問題,DAS的自動SQL限流,自動SQL最佳化需要形成聯動效應,實現問題的標本兼治。
規模性:如何構建具備足夠擴充性的服務架構,以支撐幾十萬級、百萬級的大規模自動最佳化。
問題風險
考慮兩個重要的時間點,如下圖所示,一個簡單的慢SQL趨勢,T1代表我們探索資料庫執行個體效能異常的時間點,從此刻開始著手慢SQL的最佳化,T2是最佳化過程完畢時間點,執行個體恢複常態。在傳統的最佳化處理中,這一過程一般完全依賴人力驅動,常常會暴露出兩個方面的嚴重不足:
T1過於偏後,即異常發現不及時、響應不及時,即使發現時,問題可能已堆積多時,已處在故障的邊緣。
從T1發現到T2處理的時間過長,一方面嚴重影響使用者體驗,另一方面大大增加故障風險。
除了上述的兩個問題, 我們還面臨著另外兩個更為嚴峻的挑戰:
如何?持續最佳化?及時發現問題並最佳化,避免問題積累,保證穩定的同時保持資料庫執行個體持續處在最佳運行狀態。
如何縮短處理時間長度,最大限度減少影響,採用綜合治理手段保證資料庫執行個體穩定性,實現標本兼治?
傳統方式依賴人力驅動,這兩方面的局限性會顯得尤為突出,常常處於故障驅動、疲於應對、四處救火的狀態。隨著業務規模發展,執行個體規模擴大,所有這些問題也隨之被放大,並且大機率會進入即使投入更多人力也沒有辦法解決的惡性迴圈狀態。
解決方案
自動SQL最佳化服務是阿里雲資料庫自治服務DAS中最為核心服務之一,以自最佳化的自治能力實現SQL最佳化的閉環。其閉環能力如下:
負載(Workload)異常檢測,識別資料庫業務變化,快速識別與定位問題SQL,如新增慢SQL、效能惡化SQL、不高效SQL等。
針對問題SQL,自動調用SQL診斷最佳化服務產生最佳化建議,如最優索引的建立、SQL語句改寫、引擎推薦等。
自動完成最佳化建議風險評估,根據資料庫執行個體負載情況、執行個體畫像自動產生灰階計劃,自動編排最佳化任務。
自動選取營運視窗,依據灰階計劃,完成相關線上變更,目前階段主要支援索引的自動上線變更。
針對上線的變更,啟動多維度最佳化效果跟蹤,持續即時全面的效能迴歸風險評估,符合預期,自動計算最佳化收益,不符預期,自動復原。
依託該全自動最佳化閉環,將重人工的被動式最佳化轉變為以智能化為基礎的主動式持續最佳化,最終實現SQL最佳化的無人值守。試想下,它就如同一群資料庫專家7x24小時不間斷地守護在你的資料庫旁邊,不知疲倦,時刻保持資料庫系統運行在最佳最佳化狀態。
實現架構
DAS自動SQL最佳化是一個基於資料驅動的閉環流程,上圖簡單描述了整個流程:
例外狀況事件:例外狀況事件是觸發自動SQL最佳化的引信,例外狀況事件由DAS事件中心統一管理,例外狀況事件產生自即時異常檢測、離線分析、workload檢測、警示系統等等。
診斷髮起:自動SQL最佳化服務從事件中心收到例外狀況事件後,會對執行個體進行初步判斷,向診斷引擎發起診斷請求並處理診斷結果(一條或多條建議),完成有效性評估,產生新的最佳化事件發送至事件中心,驅動下一步最佳化流程。
建議推送:使用者進入DAS“自治中心”,在未開啟全自治模式下,使用者可以選擇是否接受最佳化建議,在自主決策下觸發後續自動化最佳化流程。
變更上線:選擇營運視窗期,下發變更命令,並確認執行情況。
效果跟蹤和衡量:當最佳化建議生效後,決策引擎會啟動跟蹤任務,對被最佳化的SQL及相關SQL進行效能跟蹤,如果效能出現衰退,則自動復原。通常跟蹤24小時後,如無復原則計算收益。
問題發現
SQL最佳化支援多種情境的SQL異常發現,概括為以下三種:
定時觸發:常規性在營運視窗期,定期對使用者執行個體發生的慢SQL進行離線分析,發起SQL最佳化。
部分SQL效能惡化觸發:Workload異常檢測演算法會即時發現效能惡性SQL,觸發SQL自動最佳化。對於複雜的線上問題,自動SQL最佳化和DAS的自動SQL限流會形成聯動效應,發起SQL自動最佳化。
執行個體workload變化觸發:隨著業務SQL的上線和下線,資料庫負載、資料量發生變化,現有索引不能很好匹配當前業務的效能要求,發起執行個體Workload層面的診斷最佳化。
診斷能力
DAS的SQL診斷最佳化服務是自動SQL最佳化強大後盾,它採用基於代價模型方式,也就是採用和資料庫最佳化器相同的方式去思考最佳化問題,並會以執行代價的方式量化評估所有可能的推薦候選項,最終作出可靠推薦。
該服務已在阿里巴巴集團內部穩定運行多年,日平均診斷量在5萬左右,支撐著整個集團業務應用的SQL最佳化,SQL診斷成功率保持在98%以上,針對慢SQL的推薦率保持在75%以上。
安全變更
安全變更體現在變更前的安全檢查、灰階的變更策略、變更後的效能跟蹤。
安全檢查:為降低風險,變更僅發生在營運視窗期,同時我們會進行主備延遲、執行個體負載和資料表空間判斷,各指標都在安全範圍內時才進行變更。
灰階的變更策略:如大量分庫分表情境,為降低風險,自動產生灰階計劃,分批變更。變更過程中,系統會監控執行個體的主備延遲,一旦延遲超過閾值,立刻暫停該庫的全部索引變更任務,並保障每個庫僅允許一個變更任務執行。
效果評估:效果評估演算法會對被最佳化的SQL及相關SQL模板進行效能跟蹤,避免出現效能惡化導致故障。效能跟蹤的演算法基於決策樹模型,包括全量SQL追蹤和慢SQL追蹤等多維度追蹤,對SQL模板最佳化後的效能指標與最佳化前進行對比,綜合判斷SQL模板在該時刻是否發生了效能衰減。業務往往是以天為周期變化,預設跟蹤時間為24小時,若沒有復原,則認為本次最佳化成功,並計算實際最佳化收益。
支援的引擎
自動SQL最佳化目前已支援的資料庫引擎包括RDS MySQL、PolarDB MySQL版和RDS PostgreSQL。