GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例

gaussdb,dws,性能,sort,groupagg,聚集,引起,瓶颈,案例 · 浏览次数 : 9

小编点评

**华为云新鲜技术性能分析** **1.原始SQL语句 verbose执行计划** ``` E-rows: 138 HASH_JOIN: 102 SORT+GROUPAgg: 101 ``` **2.调优前执行计划** ``` E-rows: 126 HASH_JOIN: 101 SORT+GROUPAgg: 100 ``` **3. 调优后执行计划** ``` E-rows: 118 HASH_JOIN: 101 SORT+GROUPAgg: 100 ``` **4. 性能分析结果** * 优化器选择Sort+GroupAgg聚集方式。 * 由于输入行数较少,所以采用Sort+GroupAgg聚集方式。 * 优化后语句执行时间下降为22s+。 **5. 优化建议** * 可以利用set enable_sort = off;或+set [gloabal] (enable_sort off)来避免使用Sort+GroupAgg聚集方式。 * 可以通过使用set enable_sort = off;或+set [gloabal] (enable_sort off)来避免使用Sort+GroupAgg聚集方式。 * 可以通过使用set enable_sort = off;或+set [gloabal] (enable_sort off)来避免使用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的聚集方式。

cke_141.png

通常情况下,Sort+GroupAgg性能并不如Hashagg,此时,可以通过利用

set enable_sort = off;

或是

+set [gloabal] (enable_sort off)

来避免使用Sort+GroupAgg聚集方式。

补充:Sort+GroupAgg与Hashagg对比

 

Hashagg

Sort+GroupAgg

执行方式

每行元组根据聚集列散列建立hash表,进行去重比较

所有元组排序后进行聚集去重操作

限制

所有聚集列支持hash散列

所有聚集列支持排序

优势

通过哈希散列比较可以快速定位到重复元组

输出结果保持有序,有利于后续有序操作

劣势

受初始散列桶个数影响较大

如果初始集较大,Sort性能较差

适合使用的情况

去重后行数较少的场景

相比Hashagg,当去重后行数和输入行数差不多,且输入行数较少时适用

cke_142.png

从上图中可以看出,调优后语句执行时间下降为22s+,性能大大提高。从performance计划可以看出,原始SQL语句verbose计划中E-rows不准确,导致优化器选择了Sort+GroupAgg聚集方式,从而使得语句执行性能下降。

附件enable_sort-1为调优前verbose执行计划,附件enable_sort-2为调优后performance执行计划

 

点击关注,第一时间了解华为云新鲜技术~

 

与GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例相似的内容:

GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例

本文针对SQL语句长时间执行不出来,且verbose执行计划中出现Sort+GroupAgg聚集方式的案例进行分析。

GaussDB(DWS)性能调优,解决DM区大内存占用问题

本文分享自华为云社区《GaussDB(DWS)性能调优:DM区优化案例——维度表关联条件存在会计期》,作者: O泡果奶~。 当前DM(P1、P3、CBGDM)存在维度表与主表关联时使用会计期作为关联条件,会导致出现大内存占用或未识别数据倾斜的问题 【场景一】f.period_id = 维度表.per

GaussDB(DWS)性能调优:indexscan导致的性能问题识别与优化

摘要:通常跑批加工场景下,都是大数量做关联操作,通常不建议使用索引。有些时候因为计划误判导致使用索引的可能会导致严重的性能问题。本文从一个典型的索引导致性能的场景重发,剖析此类问题的特征,定位方法和解决方法 本文分享自华为云社区《GaussDB(DWS)性能调优:indexscan导致的性能问题识别

数仓性能调优:如何进行函数下推

摘要:本文主要描述下函数在满足特征的前提下可以把函数属性定义为下推属性。 本文分享自华为云社区《GaussDB(DWS)性能调优:函数下推》,作者:譡里个檔 。 DWS作为MPP架构的数仓产品,其性能优势主要在分布式计算上。默认情况下,DWS为了保证结果的正确性,自定义函数默认属性是不下推的,这会导

数仓性能调优:大宽表关联MERGE性能优化

摘要:本文主要为大家讲解在数仓性能调优过程中,关于大宽表关联MERGE性能优化过程。 本文分享自华为云社区《GaussDB(DWS)性能调优:大宽表关联MERGE性能优化》,作者:譡里个檔。 【业务背景】 如下MERGE语句执行耗时长达2034s MERGE INTO sdifin.hah_ae_l

解读数仓常用模糊查询的优化方法

摘要:本文讲解了GaussDB(DWS)上模糊查询常用的性能优化方法,通过创建索引,能够提升多种场景下模糊查询语句的执行速度。 本文分享自华为云社区《GaussDB(DWS) 模糊查询性能优化》,作者: 黎明的风 。 在使用GaussDB(DWS)时,通过like进行模糊查询,有时会遇到查询性能慢的

GaussDB(DWS)案例丨MERGE场景下语句不下推引起的性能瓶颈问题

本文针对MERGE场景下SQL语句因执行不下推而导致执行效率低下的案例进行分析。

带你掌握数仓的作业级监控TopSQL

摘要:目前TopSQL功能被用户广泛使用,是性能定位、劣化分析、审计回溯等重要的基石,为用户提供覆盖内存、耗时、IO、网络、空间等多方面的监控能力。 本文分享自华为云社区《GaussDB(DWS)监控工具指南(一)作业级监控TopSQL》,作者:幕后小黑爪 。 1、引言: 监控系统是智能化管理和自动

sequence:从认识到会使用,今儿给你讲的透透的

摘要:本文简单介绍sequence的使用场景及如何修改sequence的cache值提高性能。 本文分享自华为云社区《GaussDB(DWS)关于sequence的那些事》,作者:Arrow0lf 。 什么是sequence sequence,也称作序列,是用来产生唯一整数的数据库对象。序列的值按照

详解数仓中sequence的应用场景及优化

摘要:本文简单介绍sequence的使用场景及如何修改sequence的cache值提高性能。 本文分享自华为云社区《GaussDB(DWS)关于sequence的那些事》,作者:Arrow0lf 。 什么是sequence sequence,也称作序列,是用来产生唯一整数的数据库对象。序列的值按照