问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

GaussDB性能优化:掌握max_streams_per_query

创作时间:
作者:
@小白创作中心

GaussDB性能优化:掌握max_streams_per_query

引用
CSDN
6
来源
1.
https://m.blog.csdn.net/devcloud/article/details/140169348
2.
https://m.sohu.com/a/841858761_121798711/?pvid=000115_3w_a
3.
https://m.sohu.com/a/838017535_121798711/?pvid=000115_3w_a
4.
https://developer.huawei.com/consumer/cn/forum/topic/0201145637119957092
5.
https://support.huaweicloud.com/devg-dws/dws_04_0912.html
6.
https://www.cnblogs.com/huaweiyun/p/18080287

在分布式数据库系统中,查询性能优化是一个永恒的话题。GaussDB作为一款高性能的分布式数据库,提供了丰富的参数供DBA和开发人员进行性能调优。其中,max_streams_per_query是一个关键参数,它直接影响着查询计划的生成和执行效率。本文将深入探讨这个参数的作用、原理以及最佳实践。

01

Stream节点:分布式查询的核心

在分布式数据库中,数据往往分布在多个节点上。当执行一个涉及多个表的复杂查询时,系统需要在各个节点之间传输数据,这个过程被称为数据重分布(Data Redistribution)。而Stream节点,正是负责数据传输和并行处理的关键组件。

Stream节点的主要功能包括:

  • 数据传输:在分布式环境中,将数据从一个节点传输到另一个节点。
  • 并行处理:支持数据的并行处理,提高查询执行效率。
  • 数据重分布:根据查询需求,对数据进行重新分布,确保数据在各个节点上均匀分布。

然而,过多的Stream节点也会带来问题。每个Stream节点都需要消耗系统资源,包括CPU、内存和网络带宽。如果一个查询计划中包含过多的Stream节点,可能会导致资源耗尽,影响查询性能。因此,合理控制Stream节点的数量变得尤为重要。

02

max_streams_per_query:参数详解

max_streams_per_query参数用于限制单个查询计划中Stream操作符的最大数目。通过合理设置这个参数,可以避免查询计划过于复杂,防止因过多并发流处理导致资源耗尽。

  • 取值范围

    • -1:无限制,允许任意数量的Stream节点。
    • 0~10000:设定具体的上限,超过该数值将导致查询计划报错并拒绝执行。
  • 应用场景

    • 当设置为-1时,系统对Stream节点数量不设限,适合需要高度灵活性的复杂查询场景。
    • 设置一个正整数(如5000)可避免查询计划过于复杂,防止因过多并发流处理导致资源耗尽。
  • 注意事项

    • 此参数仅影响DN(数据节点)上的Stream节点,CN(协调节点)上的Gather节点不受其约束。
    • 修改此参数不会影响Explain类型的查询计划展示,但会影响实际执行的查询(如Explain Analyze或Explain Performance)。
03

实战案例:优化数据仓库查询性能

在实际应用中,max_streams_per_query参数的合理设置可以显著提升查询性能。以下是一个来自华为云社区的真实案例,展示了如何通过调整这个参数解决数据仓库中的性能瓶颈。

案例背景

在某数据仓库项目中,业务方反馈一个复杂的SQL查询执行时间过长,且占用大量系统资源。经分析发现,该查询涉及多个维度表的关联,其中使用了会计期(period_id)作为关联条件。这种情况下,维度表无法进行分区剪枝,导致数据量过大,产生了数据倾斜和关联下盘问题。

原始SQL(简化版)

SELECT ...
FROM
  DMACC.dm_adp_ar_trx_dtl_tmp F
  INNER JOIN DMDIM.DM_DIM_REGION_RC_D REG ON F.COA_GEO_PC_KEY = REG.GEO_PC_KEY
  INNER JOIN DMDIM.DM_DIM_PRODUCT_T_D T9 ON F.PROD_KEY = T9.PROD_KEY
  ...
LEFT JOIN DMAR.DWB_FMD_DIM_INVOICE_PAY_PLAN_D PP ON F.AR_INVOICE_PAY_PLAN_ID = PP.AR_INVOICE_PAY_PLAN_ID 
AND F.PERIOD_ID = PP.PERIOD_ID
...

性能分析

通过执行计划分析发现,由于会计期关联条件的存在,维度表无法进行有效的分区剪枝。这导致了:

  1. 数据量过大:维度表的全量数据需要参与计算。
  2. 数据倾斜:某些节点需要处理的数据量远大于其他节点。
  3. 关联下盘:由于数据量过大,无法在内存中完成关联操作,不得不使用磁盘,大大降低了执行效率。

优化方案

  1. 调整SQL语句:将会计期的关联条件提前,先过滤出特定会计期的数据,再进行后续的关联操作。

优化后的SQL(关键部分):

LEFT JOIN (
  SELECT * 
  FROM DMAR.DWB_FMD_DIM_INVOICE_PAY_PLAN_D 
  WHERE PERIOD_ID = '202406'
) PP ON F.AR_INVOICE_PAY_PLAN_ID = PP.AR_INVOICE_PAY_PLAN_ID
  1. 设置max_streams_per_query:为了避免生成过多的Stream节点,将max_streams_per_query参数设置为一个合理的值,例如5000。

优化效果

通过上述优化,查询性能得到了显著提升:

  • 执行时间从原来的数小时缩短到几分钟。
  • 系统资源占用明显降低,避免了数据倾斜和关联下盘问题。
  • 查询稳定性提高,不再出现因资源耗尽导致的查询失败。
04

最佳实践和建议

  1. 开发阶段识别:在开发阶段就应识别并优化包含大量Streaming算子的SQL语句,避免上线后出现性能问题。
  2. 合理设置上限:根据系统资源和业务需求,合理设置max_streams_per_query的上限。建议从较低值开始,逐步调整到最优值。
  3. 监控和调优:在生产环境中持续监控查询性能,对于频繁出现资源耗尽的查询,及时调整参数或优化SQL。
  4. 注意CN节点:由于CN节点上的Gather节点不受此参数限制,需要单独关注CN节点的资源使用情况。

通过合理设置和使用max_streams_per_query参数,可以有效避免分布式数据库中因过多Stream节点导致的性能问题。在实际应用中,需要结合具体业务场景和系统资源,不断调整和优化,以达到最佳性能表现。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号