当前位置:网站首页>解析數倉lazyagg查詢重寫優化
解析數倉lazyagg查詢重寫優化
2022-06-25 13:00:00 【華為雲開發者聯盟】
摘要:本文對Lazy Agg查詢重寫優化和GaussDB(DWS)提供的Lazy Agg重寫規則進行介紹。
本文分享自華為雲社區《GaussDB(DWS) lazyagg查詢重寫優化解析【這次高斯不是數學家】》,作者: OreoreO 。
聚集操作將查詢結果按某一列或多列的值分組,值相等的為一組。聚集操作是一種常見的操作並在金融客戶中有廣泛的使用。例如如下語句:
SELECT a, count(a) FROM t1 GROUP BY a; -- 按a分組並計算分組內重複值的個數一、Lazy Agg重寫規則
數據量大的場景下,聚集運算由於數據量大導致下盤,聚集操作執行時間成為性能瓶頸,從而導致整個查詢執行效率非常差。例如:
SELECT t2.b, sum(cc) FROM (SELECT b, sum(c) AS cc FROM t1 GROUP BY b) AS s, t2 WHERE s.b=t2.b GROUP BY t2.b;子查詢對t1.b列進行聚集,對t1.c列求和,在外部查詢中,同樣也存在聚集運算,對子查詢的聚集求和列cc列求和。對於這類語句,當子查詢的聚集運算較耗時的情况下,可以利用查詢重寫規則消除子查詢的聚集運算,由外部查詢的聚集函數統一完成聚集運算。消除子查詢後可能導致子查詢行數增多,但對於子查詢聚集運算時t1.b列的distinct值較多的場景,子查詢聚集運算後的行數較原錶不會有明顯縮减,不會導致外層JOIN運算量的大量增加。即語句可被重寫為:
SELECT t2.b, sum(cc) FROM (SELECT b, c AS cc FROM t1) AS s, t2 WHERE s.b=t2.b GROUP BY t2.b;這個改寫規則稱為Lazy Agg,適用於基錶數據量大且distinct值較多的場景。如果重複值較少,那麼消除了聚集操作會導致Join後的行數激增,Join性能較差,因此需要將Agg下推到Join之前進行,通過提前的Agg操作减少Join結果的行數,這個改寫規則稱為Eager Agg。
二、GaussDB(DWS) lazyagg優化
為了降低調優難度,提昇產品易用性,GaussDB(DWS)提供了lazyagg查詢重寫優化規則,可以通過設置guc參數rewrite_rule包含’lazyagg’使用Lazy Agg查詢重寫優化。開啟lazyagg查詢重寫優化後,對滿足條件的場景會優化並消除子查詢中的聚集操作。原計劃如下所示:

lazyagg重寫優化後計劃如下所示:

可以看到相比於原計劃,lazyagg重寫優化後消除掉了原計劃中的聚集操作,即7號Subquery Scan算子和8號HashAggregate算子。
三、lazyagg優化規格
- 支持子查詢為單一聚集查詢或包含聚集子集合操作的查詢。集合操作僅支持UNION ALL,可對部分分支子查詢進行聚集運算消除。子查詢需為JOIN錶之一(不在TargetList、Where子句等其他比特置)。
- 支持若外部查詢的所有Agg參數列包含於其某個子查詢的Agg函數列,則可對該子查詢的聚集運算進行消除。
- 支持所有消除子查詢聚集運算後結果正確的聚集函數種類。聚集函數種類結果正確性見下錶:

4. 場景約束
在上述場景擴展的基礎上,對於可能導致結果錯誤的場景,不進行查詢重寫,包括但不限於:
- 不支持消除的Agg函數類型。
- 子查詢中包含其它條件或算子,會導致重寫後結果錯誤,例如HAVING、window agg、LIMIT、OFFSET、AP function、distinct、recursive等。
- 外層Agg參數列、GROUP BY列或JOIN列中包含volatile函數,如random、timeofday等。
- 子查詢Agg函數外、外部查詢Agg函數內有其他錶達式或函數操作,如子查詢Agg函數列為sum+1、max+max(d),外部查詢Agg函數列為sum(cc+1)等。
- 外部查詢的JOIN列、GROUP BY列或其它條件中包含子查詢Agg函數列。
- 子查詢在LEFT JOIN、RIGHT JOIN的inner邊或FULL JOIN中,且子查詢Agg函數為count,外部查詢Agg函數為sum的。
四、結語
通過本文的分析,相信用戶朋友已經充分了解了Lazy Agg重寫優化的使用場景,以及GaussDB(DWS)的lazyagg實現方式。希望廣大用戶能够通過深入的了解,對GaussDB(DWS)的性能調優產生濃厚的興趣並深度參與進來。
參考文檔:
GaussDB(DWS)性能調優系列實戰篇四:十八般武藝之SQL改寫
理論不如實踐,那如何快速體驗DWS呢?DWS現推出了一項Demo體驗活動。進入DWS首頁,點擊“Demo體驗”,快速便捷體驗一把!(體驗過程中有任何建議和意見,可以去DWS社區論壇反饋哦)
边栏推荐
- Summary of leetcode linked list problem solving skills
- STM32 stores float data in flash
- 汇编标志位相关知识点(连)
- @Scheduled implementation of scheduled tasks (concurrent execution of multiple scheduled tasks)
- Online service emergency research methodology
- [转]以终为始,详细分析高考志愿该怎么填
- Wechat full-text search technology optimization
- 提高排名的 15 个基本 SEO 技巧
- 剑指 Offer II 032. 有效的变位词
- Sword finger offer day 2 linked list (simple)
猜你喜欢

Configuring pytorch in win10 environment

MySQL adds, modifies, and deletes table fields, field data types, and lengths (with various actual case statements)

三行代码简单修改jar包的项目代码

@Scheduled implementation of scheduled tasks (concurrent execution of multiple scheduled tasks)

J2EE从入门到入土01.MySQL安装

CUDA error: unspecified launch failure

Optimal solution for cold start

药物设计新福音:腾讯联合中科大、浙大开发自适应图学习方法,预测分子相互作用及分子性质

2021-09-02

515. Find Largest Value in Each Tree Row
随机推荐
剑指 Offer 第 1 天栈与队列(简单)
剑指 Offer 04. 二维数组中的查找
药物设计新福音:腾讯联合中科大、浙大开发自适应图学习方法,预测分子相互作用及分子性质
Update PIP & Download jupyter Lab
Qt显示FFmpeg解码的图片
提高排名的 15 个基本 SEO 技巧
Module 5 (microblog comments)
[flask tutorial] flask development foundation and introduction
Fedora 35 部署DNS主从和分离解析 —— 筑梦之路
Maximum number [abstract rules for abstract sorting]
Baidu search stability analysis story
Sword finger offer day 3 string (simple)
Lexical trap
[AI helps scientific research] fool drawing of loss curve
3+1 guarantee: how is the stability of the highly available system refined?
The amount is verified, and two zeros are spliced by integers during echo
康威定律,作为架构师还不会灵活运用?
聊聊高可用的 11 个关键技巧
Koa frame
KDD 2022 | GraphMAE:自监督掩码图自编码器