高級SQL優(yōu)化系列之分組排序優(yōu)化
問題定義
在如何創(chuàng)建高效的數(shù)據(jù)庫索引中,我們說到過,可以通過有序的索引(B+tree)來避免排序操作,從而提升查詢的性能。但是如果排序子句或分組子句中的字段來自不同的表,那么數(shù)據(jù)庫優(yōu)化器就無法利用索引的有序性來避免一次排序操作。
但是如果能從查詢中推斷出排序字段與另一個表的某個字段具有等值的關(guān)系,可以使用此字段來替換原排序字段,從而利用索引的有序性,在進行排序或分組時避免一次排序操作,從而提升SQL查詢性能。
譬如對于以下的SQL查詢:
select customer.* from customer, orders where c_custkey=o_custkey order by c_name, o_custkey;
排序字段為 C_NAME, o_custkey,來自不同的兩個表,但是在查詢中條件c_custkey=o_custkey,所以可以用c_custkey來替換o_custkey, 重寫后的SQL如下:
select customer.* from customer, orders where c_custkey=o_custkey order by c_name, c_custkey;
適用條件
分組排序優(yōu)化是針對查詢塊(Queryblock)來進行的,多個查詢塊可以獨立進行此優(yōu)化。分組排序優(yōu)化的適用條件如下:
- 在一個查詢塊中存在等于或大于2的排序字段或分組字段。
- 排序字段或分組字段是數(shù)據(jù)表中的列(無函數(shù)或計算)。
- 排序字段或分組字段來自不同的數(shù)據(jù)表。
- 在此查詢塊中可以推導出與排序或分組字段的等值關(guān)系。
- 經(jīng)過推導替換后的排序或分組字段來自同一個數(shù)據(jù)表。
性能驗證
- 重寫優(yōu)化前的執(zhí)行計劃如下,可以看到執(zhí)行時間為10ms,代價7849.64,執(zhí)行計劃的最后一步是排序操作。
- 重寫優(yōu)化后,排序子句中的o_custkey被替換為c_custkey,執(zhí)行計劃如下??梢钥吹剑瑑?yōu)化后排序操作被消除了,其他部分沒有變化。執(zhí)行時間減少到2.58ms,性能提升了287.6%。
PawSQL對此優(yōu)化的支持
PawSQL針對所有數(shù)據(jù)庫默認開啟此優(yōu)化,
- 自動優(yōu)化:用戶輸入待優(yōu)化SQL后,PawSQL對其進行自動化優(yōu)化,案例SQL的優(yōu)化詳情如下。
- 規(guī)則啟用:用戶可以在自己的默認優(yōu)化設(shè)置或是定義每個優(yōu)化任務(wù)的時候自主啟用或禁用該選項。
關(guān)于PawSQL
PawSQL專注數(shù)據(jù)庫性能優(yōu)化的自動化和智能化,支持MySQL,PostgreSQL,Opengauss,Oracle等數(shù)據(jù)庫,提供的SQL優(yōu)化產(chǎn)品包括
- PawSQL Cloud,在線自動化SQL優(yōu)化工具,支持SQL審查,智能查詢重寫、基于代價的索引推薦,適用于數(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)化引擎,可以以docker鏡像的方式獨立安裝部署,并通過http/json的接口提供SQL優(yōu)化服務(wù)。