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

打印 上一主题 下一主题

主题 895|帖子 895|积分 2685

本文分享自华为云社区《GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例》,作者: O泡果奶~ 。
本文针对SQL语句长时间执行不出来,且verbose执行计划中出现Sort+GroupAgg聚集方式的案例进行分析。
1、【问题描述】

语句执行时间过长,2300s+也无法得出结果。从verbose执行计划可以看出存在sort聚合。
2、【原始语句】
  1. SELECT /*+ set global(agg_redistribute_enhancement on) set global (best_agg_plan 3)*/
  2. dm_ebg_glb_kpi_sum_w_v."na_level_name",
  3. dm_ebg_glb_kpi_sum_w_v."na_level",
  4. dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_code",
  5. dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_en_name",
  6. dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_en_name",
  7. dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_cn_name",
  8. dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_cn_name",
  9. dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_code",
  10. dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_code",
  11. dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_en_name",
  12. dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_cn_name",
  13. dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_cn_name",
  14. dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_en_name",
  15. dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_code",
  16. dm_ebg_glb_kpi_sum_w_v."period_id",
  17. dm_ebg_glb_kpi_sum_w_v."year",
  18. dm_ebg_glb_kpi_sum_w_v."month",
  19. dm_ebg_glb_kpi_sum_w_v."report_category_cn_name",
  20. dm_ebg_glb_kpi_sum_w_v."report_category_en_name",
  21. dm_ebg_glb_kpi_sum_w_v."currency_code",
  22. dm_ebg_glb_kpi_sum_w_v."exchange_rate_type_cn_name",
  23. dm_ebg_glb_kpi_sum_w_v."exchange_rate_type_en_name",
  24. dm_ebg_glb_kpi_sum_w_v."report_item_code",
  25. dm_ebg_glb_kpi_sum_w_v."report_item_cn_name",
  26. dm_ebg_glb_kpi_sum_w_v."report_item_en_name",
  27. dm_ebg_glb_kpi_sum_w_v."report_item_type",
  28. dm_ebg_glb_kpi_sum_w_v."report_item_flag",
  29. dm_ebg_glb_kpi_sum_w_v."region_code",
  30. dm_ebg_glb_kpi_sum_w_v."region_cn_name",
  31. dm_ebg_glb_kpi_sum_w_v."region_en_name",
  32. dm_ebg_glb_kpi_sum_w_v."oversea_flag",
  33. dm_ebg_glb_kpi_sum_w_v."repoffice_code",
  34. dm_ebg_glb_kpi_sum_w_v."repoffice_cn_name",
  35. dm_ebg_glb_kpi_sum_w_v."repoffice_en_name",
  36. dm_ebg_glb_kpi_sum_w_v."ebg_focus_cn_name",
  37. dm_ebg_glb_kpi_sum_w_v."ebg_focus_en_name",
  38. dm_ebg_glb_kpi_sum_w_v."lv0_prod_rnd_team_code",
  39. dm_ebg_glb_kpi_sum_w_v."lv0_prod_rd_team_cn_name",
  40. dm_ebg_glb_kpi_sum_w_v."lv0_prod_rd_team_en_name",
  41. dm_ebg_glb_kpi_sum_w_v."lv1_prod_rnd_team_code",
  42. dm_ebg_glb_kpi_sum_w_v."lv1_prod_rd_team_cn_name",
  43. dm_ebg_glb_kpi_sum_w_v."lv1_prod_rd_team_en_name",
  44. dm_ebg_glb_kpi_sum_w_v."lv2_prod_rnd_team_code",
  45. dm_ebg_glb_kpi_sum_w_v."lv2_prod_rd_team_cn_name",
  46. dm_ebg_glb_kpi_sum_w_v."lv2_prod_rd_team_en_name",
  47. dm_ebg_glb_kpi_sum_w_v."lv3_prod_rnd_team_code",
  48. dm_ebg_glb_kpi_sum_w_v."lv3_prod_rd_team_cn_name",
  49. dm_ebg_glb_kpi_sum_w_v."lv3_prod_rd_team_en_name",
  50. dm_ebg_glb_kpi_sum_w_v."named_account_flag",
  51. dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_code",
  52. dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_cn_name",
  53. dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_en_name",
  54. dm_ebg_glb_kpi_sum_w_v."industry_class_code",
  55. dm_ebg_glb_kpi_sum_w_v."industry_class_cn_name",
  56. dm_ebg_glb_kpi_sum_w_v."industry_class_en_name",
  57. dm_ebg_glb_kpi_sum_w_v."sub_industry_class_code",
  58. dm_ebg_glb_kpi_sum_w_v."sub_industry_class_cn_name",
  59. dm_ebg_glb_kpi_sum_w_v."sub_industry_class_en_name",
  60. dm_ebg_glb_kpi_sum_w_v."focus_industry_cn_name",
  61. dm_ebg_glb_kpi_sum_w_v."focus_industry_en_name",
  62. dm_ebg_glb_kpi_sum_w_v."sales_mode_code",
  63. dm_ebg_glb_kpi_sum_w_v."sales_mode_cn_name",
  64. dm_ebg_glb_kpi_sum_w_v."sales_mode_en_name",
  65. SUM(dm_ebg_glb_kpi_sum_w_v."ptd_amt") as "ptd_amt",
  66. SUM(dm_ebg_glb_kpi_sum_w_v."py_ptd_amt") as "py_ptd_amt",
  67. SUM(dm_ebg_glb_kpi_sum_w_v."pp_ptd_amt") as "pp_ptd_amt",
  68. SUM(dm_ebg_glb_kpi_sum_w_v."qtd_amt") as "qtd_amt",
  69. SUM(dm_ebg_glb_kpi_sum_w_v."py_qtd_amt") as "py_qtd_amt",
  70. SUM(dm_ebg_glb_kpi_sum_w_v."pp_qtd_amt") as "pp_qtd_amt",
  71. SUM(dm_ebg_glb_kpi_sum_w_v."ytd_amt") as "ytd_amt",
  72. SUM(dm_ebg_glb_kpi_sum_w_v."py_ytd_amt") as "py_ytd_amt",
  73. SUM(dm_ebg_glb_kpi_sum_w_v."py_all_ytd_amt") as "py_all_ytd_amt",
  74. SUM(dm_ebg_glb_kpi_sum_w_v."end_bal_amt") as "end_bal_amt",
  75. SUM(dm_ebg_glb_kpi_sum_w_v."cp_open_bal_amt") as "cp_open_bal_amt",
  76. SUM(dm_ebg_glb_kpi_sum_w_v."pq_end_bal_amt") as "pq_end_bal_amt",
  77. SUM(dm_ebg_glb_kpi_sum_w_v."cy_open_bal_amt") as "cy_open_bal_amt",
  78. SUM(dm_ebg_glb_kpi_sum_w_v."py_end_bal_amt") as "py_end_bal_amt"
  79. FROM fin_dmr_ebgdis.dm_ebg_glb_kpi_sum_w_v
  80. where 1 = 1
  81. and 1 = 1
  82. AND dm_ebg_glb_kpi_sum_w_v."period_id" = 202302
  83. group by dm_ebg_glb_kpi_sum_w_v."na_level_name",
  84. dm_ebg_glb_kpi_sum_w_v."na_level",
  85. dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_code",
  86. dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_en_name",
  87. dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_en_name",
  88. dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_cn_name",
  89. dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_cn_name",
  90. dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_code",
  91. dm_ebg_glb_kpi_sum_w_v."sales_lv1_prod_list_code",
  92. dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_en_name",
  93. dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_cn_name",
  94. dm_ebg_glb_kpi_sum_w_v."sales_lv3_prod_list_cn_name",
  95. dm_ebg_glb_kpi_sum_w_v."sales_lv0_prod_list_en_name",
  96. dm_ebg_glb_kpi_sum_w_v."sales_lv2_prod_list_code",
  97. dm_ebg_glb_kpi_sum_w_v."period_id",
  98. dm_ebg_glb_kpi_sum_w_v."year",
  99. dm_ebg_glb_kpi_sum_w_v."month",
  100. dm_ebg_glb_kpi_sum_w_v."report_category_cn_name",
  101. dm_ebg_glb_kpi_sum_w_v."report_category_en_name",
  102. dm_ebg_glb_kpi_sum_w_v."currency_code",
  103. dm_ebg_glb_kpi_sum_w_v."exchange_rate_type_cn_name",
  104. dm_ebg_glb_kpi_sum_w_v."exchange_rate_type_en_name",
  105. dm_ebg_glb_kpi_sum_w_v."report_item_code",
  106. dm_ebg_glb_kpi_sum_w_v."report_item_cn_name",
  107. dm_ebg_glb_kpi_sum_w_v."report_item_en_name",
  108. dm_ebg_glb_kpi_sum_w_v."report_item_type",
  109. dm_ebg_glb_kpi_sum_w_v."report_item_flag",
  110. dm_ebg_glb_kpi_sum_w_v."region_code",
  111. dm_ebg_glb_kpi_sum_w_v."region_cn_name",
  112. dm_ebg_glb_kpi_sum_w_v."region_en_name",
  113. dm_ebg_glb_kpi_sum_w_v."oversea_flag",
  114. dm_ebg_glb_kpi_sum_w_v."repoffice_code",
  115. dm_ebg_glb_kpi_sum_w_v."repoffice_cn_name",
  116. dm_ebg_glb_kpi_sum_w_v."repoffice_en_name",
  117. dm_ebg_glb_kpi_sum_w_v."ebg_focus_cn_name",
  118. dm_ebg_glb_kpi_sum_w_v."ebg_focus_en_name",
  119. dm_ebg_glb_kpi_sum_w_v."lv0_prod_rnd_team_code",
  120. dm_ebg_glb_kpi_sum_w_v."lv0_prod_rd_team_cn_name",
  121. dm_ebg_glb_kpi_sum_w_v."lv0_prod_rd_team_en_name",
  122. dm_ebg_glb_kpi_sum_w_v."lv1_prod_rnd_team_code",
  123. dm_ebg_glb_kpi_sum_w_v."lv1_prod_rd_team_cn_name",
  124. dm_ebg_glb_kpi_sum_w_v."lv1_prod_rd_team_en_name",
  125. dm_ebg_glb_kpi_sum_w_v."lv2_prod_rnd_team_code",
  126. dm_ebg_glb_kpi_sum_w_v."lv2_prod_rd_team_cn_name",
  127. dm_ebg_glb_kpi_sum_w_v."lv2_prod_rd_team_en_name",
  128. dm_ebg_glb_kpi_sum_w_v."lv3_prod_rnd_team_code",
  129. dm_ebg_glb_kpi_sum_w_v."lv3_prod_rd_team_cn_name",
  130. dm_ebg_glb_kpi_sum_w_v."lv3_prod_rd_team_en_name",
  131. dm_ebg_glb_kpi_sum_w_v."named_account_flag",
  132. dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_code",
  133. dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_cn_name",
  134. dm_ebg_glb_kpi_sum_w_v."domtc_entps_indu_class_en_name",
  135. dm_ebg_glb_kpi_sum_w_v."industry_class_code",
  136. dm_ebg_glb_kpi_sum_w_v."industry_class_cn_name",
  137. dm_ebg_glb_kpi_sum_w_v."industry_class_en_name",
  138. dm_ebg_glb_kpi_sum_w_v."sub_industry_class_code",
  139. dm_ebg_glb_kpi_sum_w_v."sub_industry_class_cn_name",
  140. dm_ebg_glb_kpi_sum_w_v."sub_industry_class_en_name",
  141. dm_ebg_glb_kpi_sum_w_v."focus_industry_cn_name",
  142. dm_ebg_glb_kpi_sum_w_v."focus_industry_en_name",
  143. dm_ebg_glb_kpi_sum_w_v."sales_mode_code",
  144. dm_ebg_glb_kpi_sum_w_v."sales_mode_cn_name",
  145. dm_ebg_glb_kpi_sum_w_v."sales_mode_en_name" limit 200
复制代码
3、【性能分析】

由于语句长时间无法执行完毕,通过其verbose执行计划中的E-rows可以看出,由于较小且去重后行数变化不大,优化器采用了Sort+GroupAgg的聚集方式。

通常情况下,Sort+GroupAgg性能并不如Hashagg,此时,可以通过利用
  1. set enable_sort = off;
复制代码
或是
  1. +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执行计划
 
点击关注,第一时间了解华为云新鲜技术~
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表