首页 数据库,日记,舔狗日记

在日常生活过程中会有一些应用并发接入数据库,导致数据库服务器CPU负载飙升的情况,下面分享一个案列;
一、merge语句的意义
微信图片_20240129105512.png

二、现场遇到的问题:
某厂家需要对相关数据定时入库(每隔15分钟批量入库一次),日常巡检时发现数据库CPU负载飙升,排查相关SQL后定位到该厂家的并发执行的merge语句,未优化前数据库CPU负载如下:
微信图片_20240129105944.png

相关问题SQL抓取如下(赋值测试数据样例):

merge into XXXX.XXXXX a using dual on
(
        a.rdf_id='333' AND a.TYPE='IA'
)
when not matched then
        insert
                (rdf_id, TYPE, V_00_00
                ) values
                ('333', 'IA', '1.0'
                ) when matched then
        update set a.V_00_00='1.0';

三、经过改写后的merge语句如下:

merge into t1 using dual on
(
        t1.id=:id
)
when not matched then
        insert
                (id, c
                ) values
                (:id, :c
                ) when matched then
        update set t1.c=:c"

优化后数据库CPU负载如下:
微信图片_20240129110708.png

四、除改写SQL外,修改先关ini文件也对merge批量入库有优化效果,建议先在测试库测试后再投入生产环境享用:
主要原因分析:
服务器对于MERGE 的批量优化检查是单独的,需要满足的条件包括且不限于MERGE 的表有主键 ON 列包含所有主键列 BATCH PARAM OPT 为1 等,否则正常按语句块去执行 每次都要CREATE 新的 VM,占用大量CPU
修改方法:
BATCH PARAM OPT 设置成1 ,UNIQUE 索引去掉,ON 条件要包含所有的主键列,然后 VM MEM HEAP 改回 0,重启客户端(这样批量检查 返回成功执行,虚拟机就只用创建一次,不需要频繁的ALLOC 和MEMSET)


文章评论

评论已关闭