SQL優(yōu)化神器PawSQL Advisor使用手冊(最新版)
概述
PawSQL Advisor是由PawSQL團(tuán)隊(duì)開發(fā)的,面向數(shù)據(jù)庫應(yīng)用開發(fā)人員的自動化、智能化SQL優(yōu)化工具, 它融合了業(yè)界關(guān)于數(shù)據(jù)庫優(yōu)化的最佳實(shí)踐, 從正確性和性能兩個(gè)方面對SQL進(jìn)行審查和重寫優(yōu)化;并基于SQL查詢的結(jié)構(gòu)、數(shù)據(jù)庫對象的定義及統(tǒng)計(jì)信息,提供智能索引推薦功能,幫助數(shù)據(jù)應(yīng)用開發(fā)人員一鍵提升應(yīng)用性能。
核心功能
- 基于規(guī)則的SQL審查,包括正確性審查和性能優(yōu)化審查規(guī)則。
- 基于規(guī)則的重寫優(yōu)化,推薦語義等價(jià)、但執(zhí)行效率更高的SQL。
- 智能索引推薦,滿足各種SQL語法組合的場景下,推薦最優(yōu)的索引組合。
- 基于代價(jià)的優(yōu)化驗(yàn)證,確保基于SQL重寫和索引推薦的新方案有著更好的性能。
- 索引分析引擎,對已有的索引進(jìn)行分析,識別冗余索引。
支持?jǐn)?shù)據(jù)庫
PawSQL基于自研的SQL解析器,支持多種數(shù)據(jù)庫類型以及SQL方言,當(dāng)前支持的數(shù)據(jù)庫列表如下,還在不斷增加中...
- MySQL 5.6及以上 (official)
- PostgreSQL 9.1及以上 (official)
- openGauss 1.0及以上 (official)
- MariaDB 5.6及以上(β測試)
- Oracle 9i及以上(β測試)
- KingbaseES V8(β測試)
使用手冊
1、插件安裝
PawSQL Advisor是基于IntelliJ的IDE插件,支持的Jetbrain工具包括IntelliJ IDEA,DataGrip,PyCharm,Android Studio, AppCode, DataSpell, GoLand, PhpStorm, WebStorm等, 可以通過Jetbrain應(yīng)用市場安裝。
2、配置頁面
PawSQL Advisor提供一個(gè)項(xiàng)目級的配置頁面,供用戶進(jìn)行優(yōu)化任務(wù)輸入、輸出、數(shù)據(jù)源以及執(zhí)行過程的參數(shù)配置。
(1)優(yōu)化配置
- 輸入類型,指定輸入待分析SQL的類型,目前支持以下兩種格式,
- SQL 文件,代表待優(yōu)化的SQL來自原生SQL文件, 支持ANSI標(biāo)準(zhǔn)的SQL語法及多種SQL方言,多個(gè)SQL之間通過
;
分割。 - Mapper 文件,從Mybatis的mapper配置文件里提取SQL, 并通過解析獲取所有可能的SQL組合。然后對mapper文件中的占位符根據(jù)其上下文推斷其數(shù)據(jù)類型并對其賦于一個(gè)合法的常量,從而使其能夠生產(chǎn)合法的SQL語句,以便進(jìn)行后續(xù)的查詢語句結(jié)構(gòu)分析。
注意:Mapper文件作為輸入對于應(yīng)用開發(fā)人員非常重要,因?yàn)樵趹?yīng)用開發(fā)初期,開發(fā)人員對于前端的輸入組合無法完全掌握,所能組合的SQL業(yè)務(wù)無法確定,此選項(xiàng)可以確保對于所有的組合,都能夠合適的索引推薦出來以提升性能。但是由于Mapper配置文件可能書寫不夠規(guī)范,導(dǎo)致組合出的某些SQL語句在真實(shí)的場景下永遠(yuǎn)不會出現(xiàn),進(jìn)而推薦出無用的索引。
- 結(jié)果展示,用來設(shè)定輸出的SQL優(yōu)化建議的語言,目前支持中文及英文兩種。
- 是否啟用重寫優(yōu)化,此選項(xiàng)控制是否啟用重寫優(yōu)化,在SQL以及上線的情況下,修改SQL可能無法立即實(shí)施,在此情況下,可以禁用此選項(xiàng),來獲取索引推薦的建議,快速進(jìn)行性能優(yōu)化。
- 是否啟用What-If性能驗(yàn)證,此選項(xiàng)控制是否對推薦的優(yōu)化建議進(jìn)行性能驗(yàn)證,如果啟用此選項(xiàng),PawSQL在優(yōu)化詳情中會提供SQL優(yōu)化前后的執(zhí)行計(jì)劃及代價(jià)信息,從而確保推薦的優(yōu)化建議(重寫優(yōu)化及索引推薦)能夠真實(shí)提升數(shù)據(jù)庫性能。
- 性能驗(yàn)證時(shí)是否執(zhí)行SQL,如果啟用此選項(xiàng),則在進(jìn)行What-If性能驗(yàn)證時(shí)獲取SQL的真實(shí)解析及執(zhí)行時(shí)間,避免了MySQL對中間結(jié)果表explain的缺陷,代價(jià)估算更加精確。
注意:最后兩個(gè)性能驗(yàn)證的選項(xiàng)應(yīng)避免在生產(chǎn)庫上使用,因?yàn)閷τ跊]有內(nèi)置what-if(內(nèi)置虛擬索引)的數(shù)據(jù)庫(MySQL/Postgres皆是)來說,性能驗(yàn)證是通過創(chuàng)建推薦索引并進(jìn)行explain分析執(zhí)行計(jì)劃,然后刪除推薦索引的方式來做的。這個(gè)過程在生產(chǎn)庫上會消耗一定的資源,且執(zhí)行時(shí)間可能會比較長,可能對生產(chǎn)庫上的業(yè)務(wù)運(yùn)行產(chǎn)生影響。
(2)數(shù)據(jù)庫配置
在PawSQL Advisor中,數(shù)據(jù)庫連接信息作用有兩個(gè):一用來獲取SQL對應(yīng)的數(shù)據(jù)庫對象,包括數(shù)據(jù)庫表、視圖、列、索引信息。二是用來對優(yōu)化建議進(jìn)行What-If性能驗(yàn)證,以確保優(yōu)化建議能夠提升SQL的查詢性能。
- 數(shù)據(jù)庫類型,指定連接的數(shù)據(jù)庫類型,目前支持MySQL,PostgreSQL,Opengauss, Oracle, MariaDB, KingbaseES六種數(shù)據(jù)庫.
- 地址,數(shù)據(jù)庫地址。
- 端口,數(shù)據(jù)庫端口。
- 用戶,數(shù)據(jù)庫用戶。
- 密碼,數(shù)據(jù)庫用戶密碼。
- 默認(rèn)數(shù)據(jù)庫,默認(rèn)數(shù)據(jù)庫名稱,鏈接默認(rèn)的數(shù)據(jù)庫名稱。
- 數(shù)據(jù)庫或是模式列表,數(shù)據(jù)庫列表(MySQL)或是模式列表(PostgreSQL/Opengauss),PawSQL會將列表項(xiàng)下的表、視圖、索引及其對應(yīng)的統(tǒng)計(jì)信息作為SQL性能優(yōu)化的輸入。
(3)索引推薦配置
- 是否和現(xiàn)有索引去重,此選項(xiàng)表示推薦索引時(shí),是否考慮現(xiàn)有索引,并把現(xiàn)有索引能夠覆蓋的推薦索引排除掉。啟用此選項(xiàng)的場景是不考慮刪除現(xiàn)有的索引,因?yàn)檩斎氲腟QL只是并不能代表這個(gè)數(shù)據(jù)庫上所有的SQL場景,所以只考慮新增對輸入SQL有幫助的索引。如果能夠確保輸入的SQL包含此數(shù)據(jù)庫所有的查詢,那么只保留推薦的索引就可以了,這種情況下可以不選擇此選項(xiàng),并且使用新推薦的索引代替現(xiàn)有的索引。
- 是否推薦覆蓋索引,此選項(xiàng)表示推薦索引時(shí)是否考慮覆蓋索引策略。覆蓋索引可以讓查詢只訪問索引而不需要訪問數(shù)據(jù)表(請參考《高效索引的準(zhǔn)則》),在一些場景下,覆蓋索引能夠大幅提示查詢性能。但是覆蓋索引會包含查詢條件中沒有使用的列,從而增加索引所占的磁盤空間大小。
- 覆蓋索引的最大列數(shù),此項(xiàng)設(shè)置表示在進(jìn)行覆蓋索引推薦時(shí),索引的最大列數(shù)限制。如以上所述,覆蓋索引會包含查詢條件中沒有使用的列,從而增加索引所占的磁盤空間大小。此選項(xiàng)可以控制覆蓋索引所占空間的大小,讓PawSQL能夠?yàn)橛脩籼峁┮欢臻g限制的情況下利用覆蓋索引的非回表特性。
- 索引的最大列數(shù),此選項(xiàng)限制索引的最大列數(shù),索引會占用一定的磁盤空間,且太多列的索引會讓索引樹的層級加深,從而增加索引訪問的代價(jià)。用戶可以通過此項(xiàng)設(shè)置控制索引的最大列數(shù)。
- 單表最大索引數(shù)目,如《高效索引的準(zhǔn)則》中所述,索引不是免費(fèi)的午餐,它會占用磁盤空間,并對對DML操作產(chǎn)生負(fù)面影響,因?yàn)閷τ跀?shù)據(jù)庫管理器寫入表的每一行,它還必須更新任何受影響的索引。因此,PawSQL通過此選項(xiàng)來審查單表的索引數(shù)量,并進(jìn)行警告提示。
3、執(zhí)行優(yōu)化
(1)對文件/文件夾中的SQL進(jìn)行優(yōu)化
右鍵點(diǎn)擊需要進(jìn)行分析的SQL文件或是文件夾,點(diǎn)擊PawSQL Advisor->Optimize,啟動對此文件或是文件夾中的所有SQL語句的優(yōu)化。
您也可以點(diǎn)擊PawSQL Advisor->Optimize Config...,此按鈕將調(diào)出參數(shù)配置頁面,方便您在執(zhí)行前對執(zhí)行參數(shù)進(jìn)行配置,并立即進(jìn)行優(yōu)化執(zhí)行。
(2)對選中的SQL文本進(jìn)行優(yōu)化
在IDE的文本/代碼編輯器中選中待優(yōu)化的SQL,點(diǎn)擊右鍵,點(diǎn)擊PawSQL Advisor->Optimize Selected.
同樣的,您也可以點(diǎn)擊PawSQL Advisor->Optimize Selected Config...,此按鈕將調(diào)出參數(shù)配置頁面,方便您在執(zhí)行前對執(zhí)行參數(shù)進(jìn)行配置,并立即進(jìn)行優(yōu)化執(zhí)行。
(3)優(yōu)化過程日志
查詢優(yōu)化的執(zhí)行過程可以通過下方的日志終端查看。
4、執(zhí)行結(jié)果解讀
當(dāng)優(yōu)化完成后,PawSQL會生成一個(gè)優(yōu)化匯總信息文件,并自動打開該文件。此文件是以pawTunningSummary結(jié)尾的markdown文件,建議您安裝Markdown插件(在應(yīng)用市場搜索"Markdown"進(jìn)行安裝),以便能夠通過超鏈接查看單SQL的優(yōu)化詳情。
(1)整體優(yōu)化建議
查看pawTuningSummary文件獲取優(yōu)化的整體信息,主要包括三部分。
- 整體優(yōu)化概要
- 推薦索引信息
- SQL優(yōu)化列表
4.2 單SQL優(yōu)化詳情
點(diǎn)擊整體優(yōu)化建議pawTunningSummary中的SQL優(yōu)化列表中具體的SQL名稱,可以進(jìn)入到單SQL的優(yōu)化詳情文件。此文件中的內(nèi)容主要包括:
- 原始SQL
- 重寫優(yōu)化
- 重寫后的SQL
- 重寫所應(yīng)用的優(yōu)化策略,
- 重寫優(yōu)化對應(yīng)的SQL片段
規(guī)則審查情況:
- 違反的審查規(guī)則
- 違反規(guī)則的SQL片段
索引推薦情況:
- 推薦的索引
- 索引推薦的依據(jù)
索引分析:
- 各個(gè)表上的索引列表
- 索引如何幫助此SQL執(zhí)行
- 冗余索引分析
- 單表索引個(gè)數(shù)超過閾值提示
性能驗(yàn)證:
- 性能提升比
- 驗(yàn)證生效的推薦索引
- 優(yōu)化之前的執(zhí)行計(jì)劃
- 優(yōu)化之后的執(zhí)行計(jì)劃
關(guān)于PawSQL
PawSQL專注數(shù)據(jù)庫性能優(yōu)化的自動化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL優(yōu)化產(chǎn)品包括
- PawSQL Cloud,在線自動化SQL優(yōu)化工具,支持SQL審查,智能查詢重寫、基于代價(jià)的索引推薦,適用于數(shù)據(jù)庫管理員及數(shù)據(jù)應(yīng)用開發(fā)人員。
- PawSQL Advisor,IntelliJ 插件, 適用于數(shù)據(jù)應(yīng)用開發(fā)人員,可以IDEA/DataGrip應(yīng)用市場通過名稱搜索“PawSQL Advisor”安裝。
- PawSQL Engine, 是PawSQL系列產(chǎn)品的后端優(yōu)化引擎,可以獨(dú)立安裝部署,并通過http/json的接口提供SQL優(yōu)化服務(wù)。PawSQL Engine以docker鏡像的方式提供部署安裝。