GaussDB(DWS)性能调优:generate_series导致的执行不下推问题优化方案

举报
譡里个檔 发表于 2022/09/27 20:40:43 2022/09/27
【摘要】 部分业务场景下存在记录或者维度扩展,这时候会使用函数generate_series生成序列号,作为维度扩展编号,但是在DWS里面类似generate_series这种多结果集函数会导致部分执行下推,导致性能劣化。本文主要是针对这种场景提出改写的优化思路

部分业务场景下存在记录或者维度扩展,这时候会使用函数generate_series生成序列号,作为维度扩展编号,但是在DWS里面类似generate_series这种多结果集函数会导致部分执行下推,导致性能劣化。本文主要是针对这种场景提出改写的优化思路


  • 预置条件
CREATE TABLE tmf(proj_num text, du_id bigint, du_code bigint, du_name text, item_cnt int);
CREATE TABLE ext(del_flag char, extension_value text);
  • 原始SQL
SELECT
    tmf.proj_num,
    tmf.du_id,
    tmf.du_code,
    tmf.du_name,
    'Scenario' AS extension_name
FROM tmf,
(SELECT * FROM generate_series(1,(
    SELECT
        max(length(ext.extension_value || ',') - nvl(length(replace(ext.extension_value, ',','')), 0)) max_len
    FROM ext
    WHERE ext.del_flag = 'N'))  AS LVL
) seq 
WHERE seq.lvl <= tmf.item_cnt;
  • 优化后SQL
SELECT
    tmf.proj_num,
    tmf.du_id,
    tmf.du_code,
    tmf.du_name,
    'Scenario' AS extension_name
FROM tmf,
(
    WITH RECURSIVE tmp(lvl) AS(
        SELECT
            max(length(ext.extension_value || ',') - nvl(length(replace(ext.extension_value, ',','')), 0)) max_len
        FROM ext
        WHERE ext.del_flag = 'N'

        UNION ALL

        SELECT lvl - 1 FROM tmp WHERE lvl - 1 > 0
    )
    SELECT * FROM tmp
) seq 
WHERE seq.lvl <= tmf.item_cnt;


  • 优化前后SQL语句差异

  • 执行计划差异


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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