当前位置:网站首页>解析數倉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社區論壇反饋哦)
边栏推荐
- [转]以终为始,详细分析高考志愿该怎么填
- 深圳民太安智能二面_秋招第一份offer
- And console Log say goodbye
- ByteDance dev better technology salon is coming! Participate in the activity to win a good gift, and sign up for free within a limited time!
- 2021-09-28
- JVM参数解释
- Elemntui's select+tree implements the search function
- Drawing cubes with Visio
- Oral English - continuous reading
- RESTful和RPC
猜你喜欢

2021-09-22

架构师需要具备的能力

The editor is used every day. What is the working principle of language service protocol?

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

My first experience of go+ language -- a collection of notes on learning go+ design architecture

PPT绘论文图之导出分辨率
![[Visio]平行四边形在Word中模糊问题解决](/img/04/8a1de2983d648e67f823b5d973c003.png)
[Visio]平行四边形在Word中模糊问题解决

Sword finger offer day 2 linked list (simple)
![Select randomly by weight [prefix and + dichotomy + random target]](/img/84/7f930f55f8006a4bf6e23ef05676ac.png)
Select randomly by weight [prefix and + dichotomy + random target]
![[flask tutorial] flask development foundation and introduction](/img/c4/fb80fbe6b563e3b304d59623ef6465.jpg)
[flask tutorial] flask development foundation and introduction
随机推荐
Match regular with fixed format beginning and fixed end
3+1 guarantee: how is the stability of the highly available system refined?
Oracle trigger error report table or view does not exist
始终保持疫情防控不放松 营造安全稳定的社会环境
Sword finger offer II 032 Effective anagrams
剑指 Offer II 032. 有效的变位词
Sword finger offer day 2 linked list (simple)
515. Find Largest Value in Each Tree Row
Baidu search stability analysis story
Jenkins Pipeline使用
Geospatial search: implementation principle of KD tree
20220620 interview reply
二叉树之_哈夫曼树_哈弗曼编码
CUDA error: unspecified launch failure
Serevlt初识
Differences between JS and JQ operation objects
RESTful和RPC
Slice() and slice() methods of arrays in JS
torch. Tensor splicing and list (tensors)
1024水文