耗時又繁重的SQL最佳化,以後就都交給TA吧!
接下來我們針對DAS的SQL診斷最佳化服務能力構建進行詳細的解讀。
在SQL診斷最佳化領域,基於規則方式和基於代價模型方式是兩種常被選擇的最佳化推薦演算法,在目前許多產品和服務中,基於規則的推薦方式被廣泛使用,特別是針對MySQL這種WHAT-IF核心能力缺失的資料庫,因為該方式相對來說比較簡單,容易實現,但另一面也造成了推薦過於機械化,推薦質量難以保證的問題, 舉一個例子,例如對如下簡單的SQL進行索引的推薦:
SELECT *
FROM t1
WHERE time_created >= '2017-11-25'
AND consuming_time > 1000
ORDER BY consuming_time DESC
IX1(time_created)
IX2(time_created, consuming_time)
IX3(consuming_time)
IX4(consuming_time, time_created)
但最終推薦給使用者的是哪個(或哪幾個,考慮index oring/anding的情況)索引呢?基於規則的方式很難給出精確的回答,會出現模稜兩可的局面。在這個例子中,SQL只是簡單的單表查詢,那對於再複雜一點的SQL, 例如多個表Join,以及帶有複雜的子查詢,情況又會如何呢?情況變得更糟糕,更加難以為繼。
WHAT-IF核心能力缺失:無法複用核心的資料庫最佳化器能力來對候選最佳化方案進行代價量化評估; 統計資訊缺失:候選最佳化方案的代價評估,其本質是執行計劃的代價計算,統計資訊的缺失便是無米之炊。
足夠完備性保證:影響SQL最佳化的因素很多, 例如影響索引選擇的因素有上百個,加之各因素之間形成組合,這就形成了龐大的案例特徵集合,如何讓這些特徵一一對映到測試案例也是非常龐大的工程; 測試案例設計需要專業知識且資訊量大,例如對於單一測試案例設計也需要專業知識且測試案例中攜帶的資訊量大,如索引推薦測試案例,它包括:
SQL診斷最佳化服務需要具備服務於雲上百萬級資料庫例項的能力,其線上服務能力同樣面臨巨大挑戰,例如如何實現複雜的計算服務服務化拆分,計算服務的橫向伸縮,最大化的並行,資源訪問分散式環境下的併發控制,不同優先順序的有效排程消除隔離,峰值緩衝等等。
能力構建
面對上面提到的眾多挑戰,下面著重從DAS中的SQL診斷最佳化引擎核心技術架構以及能力測試集的構建兩個維度進一步解讀。
SQL解析與驗證:引擎對查詢語句做解析驗證,驗證輸入查詢語句是否符合標準,識別查詢語句的組成形成語法樹,例如:謂詞以及謂詞型別、排序欄位、聚合欄位、查詢欄位等,識別查詢語句相關欄位的資料型別。驗證SQL使用到的表、欄位是否符合目標資料庫的結構設計。 候選索引生成:依據解析驗證後的語法樹,生成多種候選索引組合; 基於代價評估:代價評估基於內建獨立於資料庫核心的最佳化器,獲取資料庫統計資訊,在診斷引擎內部作快取。診斷引擎內建最佳化器基於統計資訊計算代價,評估每個索引的代價以及不同SQL改寫方法下的代價評估,從而從代價選擇最優索引或SQL改寫方法。 索引合併與擇優:引擎輸入可以是一條查詢語句,也可以為多個查詢語句,或者整個資料庫例項所有的查詢語句。為多個查詢語句做索引推薦,不同的查詢語句的索引建議,以及已經存在的物理索引,有可能存在相同索引、字首相同索引、雷同索引。
4)各能力級的測試用例覆蓋率怎樣?
自助最佳化:集團使用者指定問題SQL, 服務完成診斷並提供最佳化專家建議; 自動最佳化:自動最佳化服務自動識別業務資料庫例項工作負載上的慢查詢,主動完成診斷,生成最佳化建議,評估後編排最佳化任務,自動完成後續的最佳化上線操作及效能跟蹤,形成全自動的最佳化閉環,提升資料庫效能,持續保持資料庫例項執行在最佳最佳化狀態。
更為重要的是,SQL診斷最佳化服務已經構建了有效的主動式分析,反饋系統,線上診斷失敗案例,使用者反饋案例,自動最佳化中的回滾案例會自動迴流到案例系統,一刻不停地驅動著診斷服務在快速迭代中成長。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940574/viewspace-2685820/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 快把你繁重的viewpager換成recyclerview吧Viewpager
- 如何避免費錢又耗時的專案延期?
- 實時獲取最耗CPU的SQLSQL
- Hi,runloop 交個朋友吧OOP
- 性感的Promise,擁抱ta然後扒光taPromise
- arXiv熱文解讀 | 不懂Photoshop如何P圖?交給深度學習吧深度學習
- Python趣味程式設計:定時給Ta講笑話Python程式設計
- 輔導作業這麼費勁的事,還是交給這個大模型吧大模型
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- 用Python打造你的專屬情人節賀卡,趕快發給TA浪漫一下吧Python
- 如何在耗時較長的操作完成後得到提醒?
- 分享:ODC 如何精準展現 SQL 執行的耗時?SQL
- 實時查詢最耗CPU資源的SQL語句SQL
- 得物佈局構建耗時最佳化方案實踐
- 實時獲得最耗CPU資源的SQL語句(zt)SQL
- 找出最耗資源的sqlSQL
- js獲取多少天以後的時間JS
- 耗cpu sql ---013SQL
- 暫時記錄,以後歸檔。
- 耗時21天,一群獨立開發者以遊戲致敬最美“逆行者”遊戲
- MySQL 驅動中虛引用 GC 耗時最佳化與原始碼分析MySqlGC原始碼
- Redcord 一個可以實時定位Ta的AppAPP
- 後臺程式在處理繁重的任務時,呼叫外部程式非同步執行的簡單實現非同步
- 心情不好的時候,用 Python 畫棵櫻花樹送給自己吧Python
- HTML5前端開發影片教程限時送,儘管去努力剩下的就交給時間!HTML前端
- 耗時6小時的同花順面試面試
- oracle 高耗cpu sql語句的捕捉 。OracleSQL
- T-SQL運維指令碼——檢視SQLServer平均最耗資源時間的SQL語句SQL運維指令碼Server
- 給手機端頁面留一個除錯後門吧(vue)除錯Vue
- 模組化日常:耗時的釋出
- 面試官:給你一段有問題的SQL,如何最佳化?面試SQL
- Yii1列印當前請求所有執行的SQL及耗時SQL
- Kibana查詢耗時
- 樹 耗時 計算 圖
- 以後的內容......
- 竊取 2500 萬美元加密貨幣後,駭客竟又歸還給dForce加密
- 匯出處理耗時的檔案
- 【SQL最佳化】SQL最佳化的10點注意事項SQL