GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例
本文分享自华为云社区《GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例》,作者: O泡果奶~ 。
本文针对SQL语句长时间执行不出来,且verbose执行计划中出现Sort+GroupAgg聚集方式的案例进行分析。
1、【问题描述】
语句执行时间过长,2300s+也无法得出结果。从verbose执行计划可以看出存在sort聚合。
2、【原始语句】
SELECT /*+ set global(agg_redistribute_enhancement on) set global (best_agg_plan 3)*/ dm_ebg_glb_kpi_sum_w_v."na_level_name", dm_ebg_glb_kpi_sum_w_v."na_level", dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_code", dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_en_name", dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_en_name", dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_code", dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_code", dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_en_name", dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_en_name", dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_code", dm_ebg_glb_kpi_sum_w_v."period_id", dm_ebg_glb_kpi_sum_w_v."year", dm_ebg_glb_kpi_sum_w_v."month", dm_ebg_glb_kpi_sum_w_v."report_category_cn_name", dm_ebg_glb_kpi_sum_w_v."report_category_en_name", dm_ebg_glb_kpi_sum_w_v."currency_code", dm_ebg_glb_kpi_sum_w_v."exchange_rate_type_cn_name", dm_ebg_glb_kpi_sum_w_v."exchange_rate_type_en_name", dm_ebg_glb_kpi_sum_w_v."report_item_code", dm_ebg_glb_kpi_sum_w_v."report_item_cn_name", dm_ebg_glb_kpi_sum_w_v."report_item_en_name", dm_ebg_glb_kpi_sum_w_v."report_item_type", dm_ebg_glb_kpi_sum_w_v."report_item_flag", dm_ebg_glb_kpi_sum_w_v."region_code", dm_ebg_glb_kpi_sum_w_v."region_cn_name", dm_ebg_glb_kpi_sum_w_v."region_en_name", dm_ebg_glb_kpi_sum_w_v."oversea_flag", dm_ebg_glb_kpi_sum_w_v."repoffice_code", dm_ebg_glb_kpi_sum_w_v."repoffice_cn_name", dm_ebg_glb_kpi_sum_w_v."repoffice_en_name", dm_ebg_glb_kpi_sum_w_v."ebg_focus_cn_name", dm_ebg_glb_kpi_sum_w_v."ebg_focus_en_name", dm_ebg_glb_kpi_sum_w_v."lv0_prod_rnd_team_code", dm_ebg_glb_kpi_sum_w_v."lv0_prod_rd_team_cn_name", dm_ebg_glb_kpi_sum_w_v."lv0_prod_rd_team_en_name", dm_ebg_glb_kpi_sum_w_v."lv1_prod_rnd_team_code", dm_ebg_glb_kpi_sum_w_v."lv1_prod_rd_team_cn_name", dm_ebg_glb_kpi_sum_w_v."lv1_prod_rd_team_en_name", dm_ebg_glb_kpi_sum_w_v."lv2_prod_rnd_team_code", dm_ebg_glb_kpi_sum_w_v."lv2_prod_rd_team_cn_name", dm_ebg_glb_kpi_sum_w_v."lv2_prod_rd_team_en_name", dm_ebg_glb_kpi_sum_w_v."lv3_prod_rnd_team_code", dm_ebg_glb_kpi_sum_w_v."lv3_prod_rd_team_cn_name", dm_ebg_glb_kpi_sum_w_v."lv3_prod_rd_team_en_name", dm_ebg_glb_kpi_sum_w_v."named_account_flag", dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_code", dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_cn_name", dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_en_name", dm_ebg_glb_kpi_sum_w_v."industry_class_code", dm_ebg_glb_kpi_sum_w_v."industry_class_cn_name", dm_ebg_glb_kpi_sum_w_v."industry_class_en_name", dm_ebg_glb_kpi_sum_w_v."sub_industry_class_code", dm_ebg_glb_kpi_sum_w_v."sub_industry_class_cn_name", dm_ebg_glb_kpi_sum_w_v."sub_industry_class_en_name", dm_ebg_glb_kpi_sum_w_v."focus_industry_cn_name", dm_ebg_glb_kpi_sum_w_v."focus_industry_en_name", dm_ebg_glb_kpi_sum_w_v."sales_mode_code", dm_ebg_glb_kpi_sum_w_v."sales_mode_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_mode_en_name", SUM(dm_ebg_glb_kpi_sum_w_v."ptd_amt") as "ptd_amt", SUM(dm_ebg_glb_kpi_sum_w_v."py_ptd_amt") as "py_ptd_amt", SUM(dm_ebg_glb_kpi_sum_w_v."pp_ptd_amt") as "pp_ptd_amt", SUM(dm_ebg_glb_kpi_sum_w_v."qtd_amt") as "qtd_amt", SUM(dm_ebg_glb_kpi_sum_w_v."py_qtd_amt") as "py_qtd_amt", SUM(dm_ebg_glb_kpi_sum_w_v."pp_qtd_amt") as "pp_qtd_amt", SUM(dm_ebg_glb_kpi_sum_w_v."ytd_amt") as "ytd_amt", SUM(dm_ebg_glb_kpi_sum_w_v."py_ytd_amt") as "py_ytd_amt", SUM(dm_ebg_glb_kpi_sum_w_v."py_all_ytd_amt") as "py_all_ytd_amt", SUM(dm_ebg_glb_kpi_sum_w_v."end_bal_amt") as "end_bal_amt", SUM(dm_ebg_glb_kpi_sum_w_v."cp_open_bal_amt") as "cp_open_bal_amt", SUM(dm_ebg_glb_kpi_sum_w_v."pq_end_bal_amt") as "pq_end_bal_amt", SUM(dm_ebg_glb_kpi_sum_w_v."cy_open_bal_amt") as "cy_open_bal_amt", SUM(dm_ebg_glb_kpi_sum_w_v."py_end_bal_amt") as "py_end_bal_amt" FROM fin_dmr_ebgdis.dm_ebg_glb_kpi_sum_w_v where 1 = 1 and 1 = 1 AND dm_ebg_glb_kpi_sum_w_v."period_id" = 202302 group by dm_ebg_glb_kpi_sum_w_v."na_level_name", dm_ebg_glb_kpi_sum_w_v."na_level", dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_code", dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_en_name", dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_en_name", dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_code", dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_code", dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_en_name", dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_en_name", dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_code", dm_ebg_glb_kpi_sum_w_v."period_id", dm_ebg_glb_kpi_sum_w_v."year", dm_ebg_glb_kpi_sum_w_v."month", dm_ebg_glb_kpi_sum_w_v."report_category_cn_name", dm_ebg_glb_kpi_sum_w_v."report_category_en_name", dm_ebg_glb_kpi_sum_w_v."currency_code", dm_ebg_glb_kpi_sum_w_v."exchange_rate_type_cn_name", dm_ebg_glb_kpi_sum_w_v."exchange_rate_type_en_name", dm_ebg_glb_kpi_sum_w_v."report_item_code", dm_ebg_glb_kpi_sum_w_v."report_item_cn_name", dm_ebg_glb_kpi_sum_w_v."report_item_en_name", dm_ebg_glb_kpi_sum_w_v."report_item_type", dm_ebg_glb_kpi_sum_w_v."report_item_flag", dm_ebg_glb_kpi_sum_w_v."region_code", dm_ebg_glb_kpi_sum_w_v."region_cn_name", dm_ebg_glb_kpi_sum_w_v."region_en_name", dm_ebg_glb_kpi_sum_w_v."oversea_flag", dm_ebg_glb_kpi_sum_w_v."repoffice_code", dm_ebg_glb_kpi_sum_w_v."repoffice_cn_name", dm_ebg_glb_kpi_sum_w_v."repoffice_en_name", dm_ebg_glb_kpi_sum_w_v."ebg_focus_cn_name", dm_ebg_glb_kpi_sum_w_v."ebg_focus_en_name", dm_ebg_glb_kpi_sum_w_v."lv0_prod_rnd_team_code", dm_ebg_glb_kpi_sum_w_v."lv0_prod_rd_team_cn_name", dm_ebg_glb_kpi_sum_w_v."lv0_prod_rd_team_en_name", dm_ebg_glb_kpi_sum_w_v."lv1_prod_rnd_team_code", dm_ebg_glb_kpi_sum_w_v."lv1_prod_rd_team_cn_name", dm_ebg_glb_kpi_sum_w_v."lv1_prod_rd_team_en_name", dm_ebg_glb_kpi_sum_w_v."lv2_prod_rnd_team_code", dm_ebg_glb_kpi_sum_w_v."lv2_prod_rd_team_cn_name", dm_ebg_glb_kpi_sum_w_v."lv2_prod_rd_team_en_name", dm_ebg_glb_kpi_sum_w_v."lv3_prod_rnd_team_code", dm_ebg_glb_kpi_sum_w_v."lv3_prod_rd_team_cn_name", dm_ebg_glb_kpi_sum_w_v."lv3_prod_rd_team_en_name", dm_ebg_glb_kpi_sum_w_v."named_account_flag", dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_code", dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_cn_name", dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_en_name", dm_ebg_glb_kpi_sum_w_v."industry_class_code", dm_ebg_glb_kpi_sum_w_v."industry_class_cn_name", dm_ebg_glb_kpi_sum_w_v."industry_class_en_name", dm_ebg_glb_kpi_sum_w_v."sub_industry_class_code", dm_ebg_glb_kpi_sum_w_v."sub_industry_class_cn_name", dm_ebg_glb_kpi_sum_w_v."sub_industry_class_en_name", dm_ebg_glb_kpi_sum_w_v."focus_industry_cn_name", dm_ebg_glb_kpi_sum_w_v."focus_industry_en_name", dm_ebg_glb_kpi_sum_w_v."sales_mode_code", dm_ebg_glb_kpi_sum_w_v."sales_mode_cn_name", dm_ebg_glb_kpi_sum_w_v."sales_mode_en_name" limit 200
3、【性能分析】
由于语句长时间无法执行完毕,通过其verbose执行计划中的E-rows可以看出,由于较小且去重后行数变化不大,优化器采用了Sort+GroupAgg的聚集方式。

通常情况下,Sort+GroupAgg性能并不如Hashagg,此时,可以通过利用
set enable_sort = off;
或是
+set [gloabal] (enable_sort off)
来避免使用Sort+GroupAgg聚集方式。
补充:Sort+GroupAgg与Hashagg对比
|
Hashagg |
Sort+GroupAgg |
|
|---|---|---|
|
执行方式 |
每行元组根据聚集列散列建立hash表,进行去重比较 |
所有元组排序后进行聚集去重操作 |
|
限制 |
所有聚集列支持hash散列 |
所有聚集列支持排序 |
|
优势 |
通过哈希散列比较可以快速定位到重复元组 |
输出结果保持有序,有利于后续有序操作 |
|
劣势 |
受初始散列桶个数影响较大 |
如果初始集较大,Sort性能较差 |
|
适合使用的情况 |
去重后行数较少的场景 |
相比Hashagg,当去重后行数和输入行数差不多,且输入行数较少时适用 |

从上图中可以看出,调优后语句执行时间下降为22s+,性能大大提高。从performance计划可以看出,原始SQL语句verbose计划中E-rows不准确,导致优化器选择了Sort+GroupAgg聚集方式,从而使得语句执行性能下降。
附件enable_sort-1为调优前verbose执行计划,附件enable_sort-2为调优后performance执行计划
- 附件:enable_sort-1.txt688.04KB
- 附件:enable_sort-2.txt1.57MB
GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例的更多相关文章
- 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写
摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...
- 十八般武艺玩转GaussDB(DWS)性能调优(三):好味道表定义
摘要:表结构设计是数据库建模的一个关键环节,表定义好坏直接决定了集群的有效容量以及业务查询性能,本文从产品架构.功能实现以及业务特征的角度阐述在GaussDB(DWS)的中表定义时需要关注的一些关键因 ...
- 十八般武艺玩转GaussDB(DWS)性能调优:路径干预
摘要:路径生成是表关联方式确定的主要阶段,本文介绍了几个影响路径生成的要素:cost_param, scan方式,join方式,stream方式,并从原理上分析如何干预路径的生成. 一.cost模型选 ...
- 数据库性能调优之始: analyze统计信息
摘要:本文简单介绍一下什么是统计信息.统计信息记录了什么.为什么要收集统计信息.怎么收集统计信息以及什么时候收集统计信息. 1 WHY:为什么需要统计信息 1.1 query执行流程 下图描述了Gau ...
- Java性能调优(一):调优的流程和程序性能分析
https://blog.csdn.net/Oeljeklaus/article/details/80656732 Java性能调优 随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我 ...
- 大厂运维必备技能:PB级数据仓库性能调优
摘要:众所周知,数据量大了之后,性能是大家关注的一点,所以我们在业务开发的时候,特别关注性能,做为一个架构师,必须对性能要了解,要懂.才能设计出高性能的业务系统. 一.GaussDB分布式架构 所谓集 ...
- 第0/24周 SQL Server 性能调优培训引言
大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...
- SQL Server 列存储性能调优(翻译)
原文地址:http://social.technet.microsoft.com/wiki/contents/articles/4995.sql-server-columnstore-performa ...
- 性能调优:理解Set Statistics IO输出
性能调优是DBA的重要工作之一.很多人会带着各种性能上的问题来问我们.我们需要通过SQL Server知识来处理这些问题.经常被问到的一个问题是:早上这个存储过程运行时间还是可以的,但到了晚上就很慢很 ...
- 在SQL Server 2016里使用查询存储进行性能调优
作为一个DBA,排除SQL Server问题是我们的职责之一,每个月都有很多人给我们带来各种不能解释却要解决的性能问题. 我就多次听到,以前的SQL Server的性能问题都还好且在正常范围内,但现在 ...
随机推荐
- 我们又组织了一次欧洲最大开源社区活动,Hugging Face 博客欢迎社区成员发帖、Hugging Chat 功能更新!
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- OpenResty入门之压测篇:压测工具界的 “悍马” wrk 审核中
在上篇文章 每个后端都应该了解的 OpenResty 入门以及网关安全实战 中,我向大家介绍了 OpenResty 的入门使用是 WAF 防御实战,这篇文章将给大家继续介绍 OpenResty 入门之 ...
- C++ 与 QML 之间进行数据交互的几种方法
一.属性绑定 这是最简单的方式,可以在QML中直接绑定C++ 对象的属性.通过在C++ 对象中使用Q_PROPERTY宏定义属性,然后在QML中使用绑定语法将属性与QML元素关联起来. person. ...
- NewStarCTF 2023 公开赛道 WEEK4|MISC 部分WP
R通大残 1.题目信息 R通大残,打了99,补! 2.解题方法 仔细分析题目,联想到隐写的R通道. 首先解释一下:R是储存红色的通道,通道里常见有R(红).G(绿).B(蓝)三个通道,如果关闭了R通道 ...
- 【scipy 基础】--傅里叶变换
傅里叶变换是一种数学变换,它可以将一个函数或信号转换为另一个函数或信号,它可以将时域信号转换为频域信号,也可以将频域信号转换为时域信号.在很多的领域都有广泛的应用,例如信号处理.通信.图像处理.计算机 ...
- Mysql数据库查询之模糊查询
一.什么是模糊查询模糊查询是根据一定的模式匹配规则,查找与指定条件相似或相符的数据.二.模糊查询实操通配符查询1.% 表示任意0个或多个字符形式一: select 查询字段 from 表名 where ...
- 通过计算巢轻松部署ROS自定义资源
概述 阿里云资源编排服务ROS(Resource Orchestration Service)可以帮助您简化云计算资源的管理.遵循ROS定义的模板规范,您可以定义所需云计算资源的集合及资源间的依赖关系 ...
- GUI界面实现小学生口算题卡功能(一)| 简要了解GUI
上课没认真听,下课不好好写. 关于GUI,首先了解了一下什么是GUI: GUI(Graphical User Interface),图形用户界面.采用图形方式显示的计算机操作用户接口.与早期计算机使用 ...
- fianl详解(适合新手)
final 1.final是Java语言中的一个关键字 2.final表示最终的,不可变的. 3.final可以修饰变量以及方法,还有类等 4.final修饰的变量? 5.final修饰的方法? 6. ...
- ZooKeeper论文阅读笔记
ZooKeeper论文传送门 介绍 ZooKeeper 是一个开源的分布式协调服务,它提供了高可用性和一致性的数据管理和协调功能.它被设计用于构建可靠的分布式系统,并提供了一组简单而强大的 wait- ...