首页 > 其他分享 >数仓性能调优:row_number() over(p)-rn=1性能瓶颈发现和改写套路

数仓性能调优:row_number() over(p)-rn=1性能瓶颈发现和改写套路

时间:2023-11-28 11:25:37浏览次数:48  
标签:数仓 LIFE 性能 改写 SQL rn PROD over CYCLE

本文分享自华为云社区《GaussDB(DWS)性能调优:row_number() over(p)-rn=1性能瓶颈发现和改写套路》,作者:Zawami 。

1、改写场景

本套路应用于子查询中含有row_number() over(partition by order by) rn,并仅把rn列用于分类排序后筛选最大值的场景。

2、性能分析

GaussDB中SQL语句的执行很多时候是流式的,即对每一条数据进行流水加工,各层算子同时在执行,缩短执行耗时。

但是在一些场景下,需要先取得前一个算子的全部结果集,然后才能够进行下一步的加工;窗口函数就是其中的一种。

观察执行计划可以看到,SQL会在计算得到rn列后,再同本层查询其它列进行关联。由于存在窗口函数,必须先把51号算子先执行完,然后才能进行关联,造成性能瓶颈。

cke_143.png

通过去窗口函数改写,我们可以使得分类汇总同明细数据之间的关联流水执行。

改写前局部SQL

SELECT

PROD_EN_NAME,

PROD_LIFE_CYCLE_STATUS

FROM

(

SELECT

PROD_EN_NAME,

LIFE_CYCLE AS PROD_LIFE_CYCLE_STATUS,

DEL_FLAG,

ROW_NUMBER ( ) OVER ( PARTITION BY PROD_EN_NAME ORDER BY RUN_DATE DESC ) RN

FROM

DMISC.DM_DIM_INV_PROD_ATTRI_SNAP_D

WHERE

DATA_TYPE = 1



AND DEL_FLAG = 'N'

AND RUN_DATE <= CAST ( '2023-06-11' || ' 00:00:00' AS TIMESTAMP )

)

WHERE

RN = 1

改写后局部SQL

WITH T AS (

SELECT

PROD_EN_NAME,

MAX ( LIFE_CYCLE ) AS PROD_LIFE_CYCLE_STATUS,

RUN_DATE

FROM

DMISC.DM_DIM_INV_PROD_ATTRI_SNAP_D

WHERE

DATA_TYPE = 1

AND DEL_FLAG = 'N'

AND RUN_DATE <= CAST ( '2023-06-11' || ' 00:00:00' AS TIMESTAMP )

GROUP BY

PROD_EN_NAME,

RUN_DATE

)

SELECT

PROD_EN_NAME,

PROD_LIFE_CYCLE_STATUS

FROM T

WHERE

(PROD_EN_NAME, RUN_DATE) IN (SELECT PROD_EN_NAME, MAX(RUN_DATE) FROM T GROUP BY PROD_EN_NAME)

改写解析:这里先把数据根据原SQL中row_number() over()的partition列和order列进行去重,由于原SQL未定义LIFE_CYCLE的排序方式,改写既可以使用MAX也可以使用MIN函数来进行聚合。然后再对去重后的数据进行过滤,过滤条件显然。

使用这种修改方法,修改前后的全量执行计划已在附件中给出。

这种改写方式解决了上层算子等窗口函数的问题。我们发现,一些业务场景下对不涉及聚合的其它列,比如上面例子中的LIFE_CYCLE并不敏感,且还需要进行进一步聚合的,那么对本层子查询中的去重其实没有硬性需求。可以进一步去除这层去重。

WITH T AS (

SELECT

PROD_EN_NAME,

LIFE_CYCLE AS PROD_LIFE_CYCLE_STATUS,

RUN_DATE

FROM

DMISC.DM_DIM_INV_PROD_ATTRI_SNAP_D

WHERE

DATA_TYPE = 1

AND DEL_FLAG = 'N'

AND RUN_DATE <= CAST ( '2023-06-11' || ' 00:00:00' AS TIMESTAMP )

)

SELECT

PROD_EN_NAME,

PROD_LIFE_CYCLE_STATUS

FROM T

WHERE

(PROD_EN_NAME, RUN_DATE) IN (SELECT PROD_EN_NAME, MAX(RUN_DATE) FROM T GROUP BY PROD_EN_NAME)

改写后执行计划如下:

cke_144.png

可以看到,执行计划中虽然51层算子只快了200ms,但由于减少阻塞,1~7层算子的执行时间缩短了,总体比原先快了约480ms。

 

点击关注,第一时间了解华为云新鲜技术~

 

标签:数仓,LIFE,性能,改写,SQL,rn,PROD,over,CYCLE
From: https://www.cnblogs.com/huaweiyun/p/17861458.html

相关文章

  • 计算机体系结构与性能总结
    计算机总体体系结构如上图,计算机从硬件到软件,而计算机系统结构就处于连接硬件与软件之间。底层为实际机器,即更偏向硬件,使用机器语言,高层为虚拟机器,即更偏向软件,使用汇编语言可转化为机器语言,这是软硬件相连节点,更高级即为高级语言。提升计算机系统性能时,总共有以下几种方法依据......
  • Linux内核调优技巧:提升CentOS 7性能的实用指南
    Linux内核调优技巧:提升CentOS7性能的实用指南在现代计算环境中,性能是一个至关重要的考量因素。对于CentOS7用户来说,合理的内核调优可以显著提升系统的响应速度、资源利用率和整体性能。本文将介绍一些实用的Linux内核调优技巧,帮助你更好地优化CentOS7系统。1.调整文件系统参......
  • 腾讯云-应用性能监控apm
    来源:https://cloud.tencent.com/document/product/1463/57474 接口监控最近更新时间:2023-04-2615:52:04    我的收藏本页目录:操作前提接口总览接口分析异常统计上下游分析 操作前提进入应用性能监控控制台,单击进入接口监控页面。接口......
  • 性能调优五步法
    本文分享自天翼云开发者社区《性能调优五步法》,作者:x****nLinux内核从2.5版本开始针对NUMA架构做了大量优化工作,同时也提供了丰富的工具和接口,可以帮助我们很容易的完成访问本地内存的设置。所以,通过适当的性能调优,可以提供更高的计算能力。性能优化通常可以通过五个步骤完......
  • DG中模拟failover故障与恢复
      转自 路人甲Java http://www.360doc.com/myfiles.aspx?reg=1&app=1&type=3  问题描述:情形是当主库真正出现异常之后,才会执行的操作,那么我们执行过failover 之后,如何在重新构建DG,这里我们利用flashbackdatabase来重构。模拟前主库要开启闪回区,否则要重新搭......
  • 3招解决时序数据高基数难题,性能多维度提升!
    本文分享自华为云社区《DTSETechTalk|3招解决时序数据高基数难题,性能多维度提升!》,作者:华为云开源。本期《openGemini全新列存引擎,为您解决时序数据高基数难题》的主题直播中,华为云开源DTSE技术布道师&数据库创新Lab技术专家黄飞腾,与开发者朋友们分享了时序数据库的特点和遥测......
  • VMware Site Recovery Manager 8.8.0.2 (for vSphere 8.0U2) - 数据中心灾难恢复 (DR)
    VMwareSiteRecoveryManager8.8.0.2(forvSphere8.0U2)-数据中心灾难恢复(DR)请访问原文链接:https://sysin.org/blog/vmware-srm-8/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org新增功能SiteRecoveryManager8.8.0.2|21NOV2023|Build22795449T......
  • diffusers sdxl 性能分析
    加载fp16模型到显存的消耗单图运算时的消耗unet阶段vae阶段双图运算时的消耗unet阶段vae阶段......
  • CF1900 A Cover in Water 题解
    LinkCF1900ACoverinWaterQuestion给出一个\(n\)个格子,有些格子被堵塞了,有些格子是空的,我需要在进行一些操作,使得所有空的格子里面都有水操作1:给任意一个格子装上水操作2:把一格水从一个地方搬运到另外一个空的格子里如果一个空的格子的相邻的两个格子都有水,那么这......
  • 3招解决时序数据高基数难题,性能多维度提升!
    本文分享自华为云社区《DTSETechTalk|3招解决时序数据高基数难题,性能多维度提升!》,作者:华为云开源。本期《openGemini全新列存引擎,为您解决时序数据高基数难题》的主题直播中,华为云开源DTSE技术布道师&数据库创新Lab技术专家黄飞腾,与开发者朋友们分享了时序数据库的特点和遥测数......