【调优实践】MERGE全量更新改写

举报
门前一棵葡萄树 发表于 2023/12/22 15:08:16 2023/12/22
【摘要】 1. 问题描述XX局点,抽数和ETL上线后,CPU一直处于50%高水位。如下:通过分析SQL发现,其数据更新全部使用MERGE且全部都是全量数据更新,SQL如下所示:MERGE INTO t1 USING t2 ON (t1.a = t2.a)WHEN NOT matched THEN INSERT VALUES(1);通过分析可知,业务侧想要的是增量数据更新,而不是全量更新。增量更新优化思...

1. 问题描述

XX局点,抽数和ETL上线后,CPU一直处于50%高水位。如下:

MERGE-01.png

通过分析SQL发现,其数据更新全部使用MERGE且全部都是全量数据更新,SQL如下所示:

MERGE INTO t1 
USING t2 
ON (t1.a = t2.a)
WHEN NOT matched THEN INSERT VALUES(1);

通过分析可知,业务侧想要的是增量数据更新,而不是全量更新。增量更新优化思路有以下两点:

  1. 更新表优化:增量数据更新时,仅需要使用更新表增量数据对被更新表进行更新,而不必使用全表数据,因此更新表逻辑可以修改为:SELECT * FROM t2 WHERE xxxx。
  2. 被更新表优化:MERGE的逻辑是关联上进行更新,关联不上插入一条;那理论上被更新表也不需要全表与更新表进行关联,只要确定更新表关联列范围[min(a),max(1)]后,被更新表也只需要获取[min(a),max(1)]范围内数据进行关联即可,可以按此修改:t1.a >= (SELECT MIN(a) FROM t2) AND (SELECT MAX(a) FROM t2))。此逻辑是否对性能有优化取决于更新表和被更新表数据量,具体可通过执行计划分析。

2.SQL改写

经过上述分析,对更新表和被更新表同时进行优化,可以得到以下SQL:

MERGE INTO t1 
USING(SELECT * FROM t2 WHERE xxxx)t2  -- 更新表过滤,优化为增量更新
ON (t1.a = t2.a AND 
t1.a >= (SELECT MIN(a) FROM t2)  AND t1.a <= (SELECT MAX(a) FROM t2))   -- 被更新表过滤
WHEN NOT matched THEN INSERT VALUES(1);

优化后,CPU使用率如下:

MERGE-02.png

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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