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、【性能分析】

原始SQL语句的执行计划如上图所示(附件一为完整performance执行计划),可以看出,该语句并未向量化执行,这会影响性能。
补充(向量化执行)
- 技术背景
在大宽表,数据量比较大、查询经常关注某些列的场景中,行存储引擎查询性能比较差。例如气象局的场景,单表有200~800个列,查询经常访问10个列,在类似这样的场景下,向量化执行技术和列存储引擎可以极大的提升性能和减少存储空间。 - 向量化执行

标准的迭代器模型如图所示。控制流向下(下图实线)、数据流向上(下图虚线)、上层驱动下层(上层节点调用下层节点要数据)、一次一元组(下层节点每次只返回一条元组给上层节点)。
而向量化执行相对于传统的执行模式改变是对于一次一元组的模型修改为一次一批元组,配合列存特性,可以带来巨大的性能提升。 - 未向量化执行原因及解决办法
- SQL语句中存在行存表。
- 将行存改为列存
- 利用hint(参数enable_force_vector_engine)强制执行器走向量化
- 若方法1不生效,可能存在不支持向量化的函数,对该函数进行识别并替换
针对该SQL语句进行分析,发现是表rtdwrsipa.ipa_item_locator_all_tmp为行存表,因此可以使用hint强制向量化执行,优化后SQL语句如下所示:
- 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(+)

优化后可以看出,SQL语句向量化执行,时间降低为88s+,附件二为完整performance执行计划。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/317084.html