首页 > 其他分享 >GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例

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

时间:2023-09-14 11:37:20浏览次数:47  
标签:Sort DWS ebg name glb 性能 dm kpi sum

 本文分享自华为云社区《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的聚集方式。

GaussDB(DWS)性能调优: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,当去重后行数和输入行数差不多,且输入行数较少时适用

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


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

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

标签:Sort,DWS,ebg,name,glb,性能,dm,kpi,sum
From: https://blog.51cto.com/u_15214399/7468329

相关文章

  • 进阶训练技巧提升模型性能
    在深度学习的世界中,训练技巧的重要性不言而喻。进阶训练技巧,包括损失函数、学习率、模型微调和半精度训练,更是对提升模型性能和准确率有着关键作用。下面我们将对这些技巧进行详细的探讨。一、损失函数(LossFunction)损失函数,或者叫作目标函数,是用来衡量模型预测输出和真实输出之间......
  • NetBenchmarkDotNet性能测试
    案例usingBenchmarkDotNet.Attributes;usingBenchmarkDotNetDemo.Model;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Threading.Tasks;namespaceBenchmarkDotNetDemo......
  • RunnerGo:提供更好的性能测试解决方案
    你是否曾经为了寻找一个可靠的性能测试工具而苦恼?传统的性能测试工具往往价格高昂,而且复杂难用,让企业难以承受。现在,我们为您推荐一款全新的性能测试工具——RunnerGo,它将为您带来前所未有的测试体验。RunnerGo是一款由国内开发者自主研发的企业级性能测试工具,它采用了轻量级、高性......
  • 升讯威在线客服系统的并发高性能数据处理技术:PLINQ并行查询技术
    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可。客户组织多名客服上线后,所有员工同一时间打开访客页面疯狂不停的给在线客服发消......
  • Apache Iceberg 表有哪些性能优化方式
    ApacheIceberg是一种开源的分布式数据表格格式,旨在提供可扩展性、性能和数据一致性。它建立在ApacheHadoop的基础上,并支持多种数据湖存储(如HadoopHDFS、AmazonS3等)。为了优化ApacheIceberg表的性能,可以采取多种策略和技术,以下是一些重要的性能优化方式和详细示例:Partition......
  • Node.js vs. Spring Boot:Hello World 性能对决,谁更快一点?
    前言:SpringBoot在Java生态中备受欢迎,它是一款基于Java构建的轻量级服务端框架,主要用于Web服务。SpringBoot的应用使得创建各类基于Spring的企业级应用变得异常简单。Node.js作为一种基于ChromeV8引擎的JavaScript运行时环境,在服务端上运行JavaScript代码。它以其独......
  • 14 性能对比分析
    packageannotate;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;//性能检测publicclassTest12{//1.普通调用publicstaticvoidtest01(){longstartTime=System.currentTimeMillis(......
  • 通信系统的性能指标
    主要性能指标:有效性(速度)、可靠性(质量)有效性模拟通信系统中:带宽数字通信系统中:码元传输速率(码元速率、传码率)单位时间(每秒)内系统传输的码元符号的数目,单位为波特(Baud),用\(......
  • MySQL+MHA搭建&&性能优化
    MHA基础概念MHAMHA(MasterHighAvailability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。MHA的出现就是解决MySQL单点的问题。MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上......
  • count() 和 count(1) 有什么区别?哪个性能最好?
    count(*)和count(1)有什么区别?哪个性能最好?count(*)和count(1)没有区别,因为count(*)会优化为count(0)count(字段)的性能是最差的,因为要遍历一遍,并且还要比较是否是null结论:count(*)=count(1)>count(字段)怎么解决呢使用近似值,使用explain命令,返回值有rows列,标识表的近......