高級SQL優(yōu)化之查詢折疊
定義
查詢折疊指的是把查詢中的視圖、CTE或是DT子查詢展開,并與引用它的查詢語句合并,從而減少查詢語句的子查詢數(shù)目,降低其復(fù)雜度的一種優(yōu)化算法。其收益有以下三個方面:
- 避免中間結(jié)果集的物化。
- 啟用更多的連接順序規(guī)劃。
- 提供更多的索引建議機(jī)會(PawSQL索引推薦引擎)。
考慮下面的例子:
SELECT * FROM (SELECT c_custkey, c_name FROM customer) AS dt;
重寫后的SQL為:
SELECT c_custkey, c_name FROM customer
注1. 在下文中,我們將使用“視圖”一詞,但所有描述也適用于CTE或是DT子查詢。
注2. 本文所使用的執(zhí)行計劃可視化工具為 PawSQL Explain Visualizer , 支持MySQL、PostgreSQL、openGauss等數(shù)據(jù)庫。
查詢折疊的兩種類型
PawSQL優(yōu)化引擎針對不同的SQL語法結(jié)構(gòu),支持兩種查詢折疊的優(yōu)化策略。
查詢折疊類型 I
適用條件
- 在視圖本身中,沒有distinct關(guān)鍵字;
- 在視圖本身中,沒有分組、聚集函數(shù)或窗口函數(shù);
- 在視圖本身中,沒有LIMIT子句;
- 在視圖本身中,沒有UNION或者UNION ALL;
- 在外部查詢塊中,被折疊的視圖不是外連接的一部分。
重寫策略
將視圖拆分并合并到外部查詢塊中。
案例
- 原始查詢
select c.c_name, sum(o_totalprice) price
from customer c, (select o_custkey, o_totalprice from orders where o_shippriority=0)dt
where c.c_custkey = dt.o_custkey
group by c.c_name
- 原執(zhí)行計劃
- 優(yōu)化后的查詢
select c.c_name, sum(o_totalprice) as price
from customer c, orders
where c.c_custkey = o_custkey and o_shippriority=0
group by c.c_name
- 優(yōu)化后的執(zhí)行計劃
我們可以看到,原查詢的執(zhí)行計劃中有一個物化步驟,通過SQL重寫后,消除了此物化步驟。
查詢折疊類型 II
適用條件:
- 在外部查詢塊中,視圖是唯一的表引用。
- 在外部查詢塊中,沒有分組、聚集函數(shù)和窗口函數(shù)。
- 在視圖內(nèi)部沒有使用窗口函數(shù)。
重寫策略:
將外部查詢合并至視圖,并刪除外部查詢。
案例
- 原始查詢
select dt.price
from (select c.c_name, sum(o_totalprice) price
from customer c, orders
where c.c_custkey = orders.o_custkey
group by c.c_name) dt
where dt.c_name like '139%';
- 原執(zhí)行計劃
- 優(yōu)化后的查詢
select sum(o.O_TOTALPRICE)
from customer as c, orders o
where c.c_custkey = o.o_custkey
and c.c_name like '139%'
group by c.c_name
- 優(yōu)化后的執(zhí)行計劃
與類型1類似,我們可以看到重寫優(yōu)化后消除了物化步驟,同時性能提升了231.83%。
注3. 其中對于第一種類型,MySQL 5.7以及PostgreSQL 14.0以上的版本都在優(yōu)化器內(nèi)部進(jìn)行了支持;而第二類查詢折疊的優(yōu)化,在最新的MySQL及PostgreSQL版本中都沒有支持。
PawSQL對查詢折疊優(yōu)化的支持
- 自動優(yōu)化:PawSQL針對所有數(shù)據(jù)庫默認(rèn)開啟此優(yōu)化,以下是案例2在PawSQL中的優(yōu)化結(jié)果;可以看到,基于重寫后的SQL,PawSQL進(jìn)一步推薦了更高效的索引。
- 點(diǎn)擊優(yōu)化頁面的執(zhí)行計劃對比圖標(biāo),可以看到優(yōu)化前后的執(zhí)行計劃對比。
- 啟用設(shè)置:用戶可以在自己的默認(rèn)優(yōu)化設(shè)置或是定義每個優(yōu)化任務(wù)的時候自主啟用或禁用該選項(xiàng)。
關(guān)于PawSQL
PawSQL專注數(shù)據(jù)庫性能優(yōu)化的自動化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的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鏡像的方式獨(dú)立安裝部署,并通過http/json的接口提供SQL優(yōu)化服務(wù)。