GaussDB(DWS)性能调优:SQL语句未向量化执行引起的性能瓶颈案例(行存表引起)

举报
O泡果奶~ 发表于 2023/10/29 17:43:46 2023/10/29
【摘要】 本文针对SQL语句因未向量化执行(存在行存表或不支持向量化的函数)导致语句执行性能劣化的案例进行分析

1、【问题描述】

GaussDB中,SQL语句在执行时未进行向量化执行(标志:执行计划中不含vector),导致执行时间长、执行效率低。

2、【原始语句】

SELECT  /*+ broadcast(bl)*/
      BSI.ORGANIZATION_CODE
      ,BSI.ITEM_CODE
      ,BSI.SUBINVENTORY_CODE 
      ,BSI.CREATED_BY        AS SUBINV_CREATED_ID  
      ,null subinv_created_name
      ,BSI.CREATION_DATE     AS SUBINV_CREATION_DATE  
      ,BIL.LOCATOR_ID  
      ,BIL.LOCATOR_CODE  
      ,BL.DESCRIPTION        AS LOCATOR_DESCRIPTION  
      ,BIL.CREATED_BY        AS LOCATOR_CREATED_ID  
      ,NULL locator_created_name
      ,BIL.CREATION_DATE     AS LOCATOR_CREATION_DATE  
      ,BSI.LAST_UPDATE_DATE AS LAST_MODIFIED_DATE
  FROM sdimfg.ogg_bas_item_sub_inventor_8656 BSI	--SDI.OGG_BAS_ITEM_SUB_INVENTOR_8656 BSI
      ,rtdwrsipa.IPA_ITEM_LOCATOR_ALL_TMP	T		--RT_ISCP_IPA.IPA_ITEM_LOCATOR_ALL_TMP T
      ,sdimfg.ogg_bas_item_locators_t_8656 BIL		--SDI.OGG_BAS_ITEM_LOCATORS_T_8656   BIL
      ,sdimfg.ogg_bas_locators_t_8656 BL			--SDI.OGG_BAS_LOCATORS_T_8656        BL
  WHERE BSI.ITEM_CODE =T.ITEM_CODE 
   AND BSI.ORGANIZATION_CODE = T.ORGANIZATION_CODE
   AND BSI.ITEM_CODE = BIL.ITEM_CODE(+)
   AND BSI.ORGANIZATION_CODE = BIL.ORGANIZATION_CODE(+)
   AND BSI.SUBINVENTORY_CODE = BIL.SUBINVENTORY_CODE(+)
   AND BIL.LOCATOR_ID = BL.LOCATOR_ID(+)

3、【性能分析】

image.png
原始SQL语句的执行计划如上图所示(附件一为完整performance执行计划),可以看出,该语句并未向量化执行,这会影响性能。

补充(向量化执行)

  • 技术背景
    在大宽表,数据量比较大、查询经常关注某些列的场景中,行存储引擎查询性能比较差。例如气象局的场景,单表有200~800个列,查询经常访问10个列,在类似这样的场景下,向量化执行技术和列存储引擎可以极大的提升性能和减少存储空间。
  • 向量化执行
    image.png
    标准的迭代器模型如图所示。控制流向下(下图实线)、数据流向上(下图虚线)、上层驱动下层(上层节点调用下层节点要数据)、一次一元组(下层节点每次只返回一条元组给上层节点)。
    而向量化执行相对于传统的执行模式改变是对于一次一元组的模型修改为一次一批元组,配合列存特性,可以带来巨大的性能提升。
  • 未向量化执行原因及解决办法
    1. SQL语句中存在行存表。
      • 将行存改为列存
      • 利用hint(参数enable_force_vector_engine)强制执行器走向量化
    2. 若方法1不生效,可能存在不支持向量化的函数,对该函数进行识别并替换
      针对该SQL语句进行分析,发现是表rtdwrsipa.ipa_item_locator_all_tmp为行存表,因此可以使用hint强制向量化执行,优化后SQL语句如下所示:
SELECT  /*+ broadcast(bl) set global(enable_force_vector_engine on)*/
      BSI.ORGANIZATION_CODE
      ,BSI.ITEM_CODE
      ,BSI.SUBINVENTORY_CODE 
      ,BSI.CREATED_BY        AS SUBINV_CREATED_ID  
      ,null subinv_created_name
      ,BSI.CREATION_DATE     AS SUBINV_CREATION_DATE  
      ,BIL.LOCATOR_ID  
      ,BIL.LOCATOR_CODE  
      ,BL.DESCRIPTION        AS LOCATOR_DESCRIPTION  
      ,BIL.CREATED_BY        AS LOCATOR_CREATED_ID  
      ,NULL locator_created_name
      ,BIL.CREATION_DATE     AS LOCATOR_CREATION_DATE  
      ,BSI.LAST_UPDATE_DATE AS LAST_MODIFIED_DATE
  FROM sdimfg.ogg_bas_item_sub_inventor_8656 BSI	--SDI.OGG_BAS_ITEM_SUB_INVENTOR_8656 BSI
      ,rtdwrsipa.IPA_ITEM_LOCATOR_ALL_TMP	T		--RT_ISCP_IPA.IPA_ITEM_LOCATOR_ALL_TMP T
      ,sdimfg.ogg_bas_item_locators_t_8656 BIL		--SDI.OGG_BAS_ITEM_LOCATORS_T_8656   BIL
      ,sdimfg.ogg_bas_locators_t_8656 BL			--SDI.OGG_BAS_LOCATORS_T_8656        BL
  WHERE BSI.ITEM_CODE =T.ITEM_CODE 
   AND BSI.ORGANIZATION_CODE = T.ORGANIZATION_CODE
   AND BSI.ITEM_CODE = BIL.ITEM_CODE(+)
   AND BSI.ORGANIZATION_CODE = BIL.ORGANIZATION_CODE(+)
   AND BSI.SUBINVENTORY_CODE = BIL.SUBINVENTORY_CODE(+)
   AND BIL.LOCATOR_ID = BL.LOCATOR_ID(+)

image.png
优化后可以看出,SQL语句向量化执行,时间降低为88s+,附件二为完整performance执行计划。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。