高級SQL優化之查詢折疊

定義
查詢折疊指的是把查詢中的視圖、CTE或是DT子查詢展開,并與引用它的查詢語句合并,從而減少查詢語句的子查詢數目,降低其復雜度的一種優化算法。其收益有以下三個方面:
- 避免中間結果集的物化。
- 啟用更多的連接順序規劃。
- 提供更多的索引建議機會(PawSQL索引推薦引擎)。
考慮下面的例子:
SELECT * FROM (SELECT c_custkey, c_name FROM customer) AS dt;重寫后的SQL為:
SELECT c_custkey, c_name FROM customer注1. 在下文中,我們將使用“視圖”一詞,但所有描述也適用于CTE或是DT子查詢。
注2. 本文所使用的執行計劃可視化工具為 PawSQL Explain Visualizer , 支持MySQL、PostgreSQL、openGauss等數據庫。
查詢折疊的兩種類型
PawSQL優化引擎針對不同的SQL語法結構,支持兩種查詢折疊的優化策略。
查詢折疊類型 I
適用條件
- 在視圖本身中,沒有distinct關鍵字;
- 在視圖本身中,沒有分組、聚集函數或窗口函數;
- 在視圖本身中,沒有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- 原執行計劃

- 優化后的查詢
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- 優化后的執行計劃

我們可以看到,原查詢的執行計劃中有一個物化步驟,通過SQL重寫后,消除了此物化步驟。
查詢折疊類型 II
適用條件:
- 在外部查詢塊中,視圖是唯一的表引用。
- 在外部查詢塊中,沒有分組、聚集函數和窗口函數。
- 在視圖內部沒有使用窗口函數。
重寫策略:
將外部查詢合并至視圖,并刪除外部查詢。
案例
- 原始查詢
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%';- 原執行計劃

- 優化后的查詢
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- 優化后的執行計劃

與類型1類似,我們可以看到重寫優化后消除了物化步驟,同時性能提升了231.83%。
注3. 其中對于第一種類型,MySQL 5.7以及PostgreSQL 14.0以上的版本都在優化器內部進行了支持;而第二類查詢折疊的優化,在最新的MySQL及PostgreSQL版本中都沒有支持。
PawSQL對查詢折疊優化的支持
- 自動優化:PawSQL針對所有數據庫默認開啟此優化,以下是案例2在PawSQL中的優化結果;可以看到,基于重寫后的SQL,PawSQL進一步推薦了更高效的索引。

- 點擊優化頁面的執行計劃對比圖標,可以看到優化前后的執行計劃對比。

- 啟用設置:用戶可以在自己的默認優化設置或是定義每個優化任務的時候自主啟用或禁用該選項。

關于PawSQL
PawSQL專注數據庫性能優化的自動化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL優化產品包括
- PawSQL Cloud,在線自動化SQL優化工具,支持SQL審查,智能查詢重寫、基于代價的索引推薦,適用于數據庫管理員及數據應用開發人員。
- PawSQL Advisor,IntelliJ 插件, 適用于數據應用開發人員,可以IDEA/DataGrip應用市場通過名稱搜索“PawSQL Advisor”安裝。
- PawSQL Engine, 是PawSQL系列產品的后端優化引擎,可以以docker鏡像的方式獨立安裝部署,并通過http/json的接口提供SQL優化服務。
























