【调优实践】MERGE全量更新改写
【摘要】 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%高水位。如下:
通过分析SQL发现,其数据更新全部使用MERGE且全部都是全量数据更新,SQL如下所示:
MERGE INTO t1
USING t2
ON (t1.a = t2.a)
WHEN NOT matched THEN INSERT VALUES(1);
通过分析可知,业务侧想要的是增量数据更新,而不是全量更新。增量更新优化思路有以下两点:
- 更新表优化:增量数据更新时,仅需要使用更新表增量数据对被更新表进行更新,而不必使用全表数据,因此更新表逻辑可以修改为:SELECT * FROM t2 WHERE xxxx。
- 被更新表优化: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使用率如下:
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)