概述:
??在真實的客戶場景中,其實我們不缺索引,索引推薦模塊主要目的是去除冗余索引,使客戶用更少索引達到相同甚至更好的查詢效率。
??該模塊提供了三種索引推薦方法:
????1:簡單索引推薦:簡單的保留高索引索引,推薦效果不理想
????2:基于貪心算法的索引推薦:容易陷入局部最優
????2:基于MTCS的索引推薦:AlphaGo也是基于該算法,推薦效果較好。
??之前我司和一個高校合作設計了一個基于DQN的索引推薦算法,MTCS相較于DQN,計算速度更快,不需要事先訓練好模型,效果也不弱與DQN。(DBMIND的Xtuner數據庫智能調參模塊也是基于MCTS)客戶對推薦效果比較滿意,但是不愿意安裝PG的虛擬索引插件,導致改研究不了了之。目前我正在研究把虛擬索引和PG的內核(parser,rewriter,planner)抽取出來集成到索引推薦模塊中,后續可以繼續做分享。
??下面主要是對基于負載的索引推薦進行解析,改方法是基于單條sql的索引推薦,單條的索引推薦主要是基于sql文本的利用專家規則來進行推薦的,我們此次不涉及該內容。該模塊內容較大,我將會分成兩篇來講,這一篇主要講解預處理和簡單索引推薦部分,下一篇講解復雜索引推薦。
模塊:
components/dao/execute_factory.py:封裝了一些靜態方法。
components/dao/driver_execute.py:通過官方driver psycopg2連接數據庫進行操作,debug時建議時候該方法,可讀性較強。
components/dao/gsql_execute.py:通過python內置的模塊subprocess和CMD命令行連接數據庫進行操作。
components/index_advisor_workload.py:基于負載的索引推薦的核心部分,后面主要對該腳本解析。
components/MCTS.py:蒙特卡洛搜索樹算法的實現。
簡單索引推薦源碼解析
?index_advisor_workload.py/main(argv):
??輸入參數:

??連接數據庫

?index_advisor_workload.py/index_advisor_workload():

??1:sql壓縮

???①sql規范化后,相同的sql合并:

???②將相似sql壓縮為sql模版:

???③將量綱變小,出現數除以限定的采樣數
??2:簡單索引推薦

???① 生成候選索引:

????①-①:調用單條sql的索引推薦(拼接sql,使用數據庫內置函數gs_index_advise)
????①-②:對上一步推薦出來的索引進行過濾(虛擬索引 + explain)

?????①-②-①:過濾相同的索引列和索引類型

?????①-②-②:過濾無用索引


????①-③:不同表的相同索引只保留一個
????①-④:使用最左匹配原則過濾索引
???②:可能會遇到某個sql執行較長時間,導致與數據庫的連接斷開。
???③:計算不加索引的cost


???④:遍歷每個索引,計算使用該索引后的增益
???⑤:保留高收益的索引





