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的性能问题都还好且在正常范围内,但现在 ...
随机推荐
- C#_TCPClient异步连接和接收消息
//c#不愧是全能型的语言,异步连线程都省了 class State { public byte[] bufferCache; public TcpClient tcpClient; } ... pr ...
- ChatGPT提示词迭代
openAI CEO 除了上一篇讲的:限定,排除,示例,生成,扩展了其他方法,包括:关键词.调教和其他使用方法 关键词 像应用搜索引擎一样,在描述的句子开头给一些关键词,比如: 问题 代码 解释 分析 ...
- 01Java学习_概述
概述 目录 概述 三个阶段 概述 历史(了解) Java 重要特点 开发工具 Java 运行机制及运行过程 下载和安装 JDK 配置环境变量 java 快速入门 博客中的图片内容全部采用 github ...
- JS判断点是否在线段上
本文利用向量的点积和叉积来判断点是否在线段上. 基础知识补充 从零开始的高中数学--向量.向量的点积.带你一次搞懂点积(内积).叉积(外积).Unity游戏开发--向量运算(点乘和叉乘 说明 点积可以 ...
- clickHouse-golang
目录 clickHouse优势与劣势 golang操作clickHouse clickHouse优势与劣势 ClickHouse和传统的MySQL在设计和使用场景上有一些显著的区别,因此它们各自具有不 ...
- 二、RHEL8操作系统安装
一.如何安装rhel的操作系统? 必要的前提条件:硬件(CPU.内存.硬盘--) + 安装介质(操作系统的安装文件) 会不会把自己的笔记本装成rhel的操作系统呢? 不会 使用虚拟机软 ...
- AdaBoost算法解密:从基础到应用的全面解析
本文全面而深入地探讨了AdaBoost算法,从其基础概念和原理到Python实战应用.文章不仅详细解析了AdaBoost的优缺点,还通过实例展示了如何在Python中实现该算法. 关注TechLead ...
- UIPath初识和安装
即使没有人为你鼓掌,也要优雅的谢幕,感谢自己的认真付出. 一. UiPath组成 学习UiPath,我们一定先要了解Studio,Robot和Orchestrator这3个重要组成部分. UiPa ...
- numpy数组基础
目录 创建数组 多维数组切片 数组属性 使用数组 数组特殊运算符 索引进阶 花式索引 创建数组 在numpy中,创建数组有很多种方法,例如如下的例子: import numpy as np sws_1 ...
- 【Android】Android Bmob后端云配置
简介 开发一个具有网络功能的应用,在Bmob移动应用云存储平台中,只需要注册一个账号,就可以实现申请创建任意多个数据库,获得对应的key,下载对应版本的SDK,并嵌入到移动应用中,调用存取的KPI,进 ...