探讨性能优化方案时,有人提出用MERGE来替代SELECT/UPD/INSERT组合。
用MERGE能提高性能吗?网上的资料有两种说法:
(1)MERGE只是简化代码的一种编程手法,不能提高性能
(2)MERGE使用的是FULL TABLE SCAN,不使用INDEX,性能只有更差
还是让事实说话吧。
①两个表T1、T2,T1中做成有10000条记录,T2中做成有5000条记录,执行的结果是插入5000条、更新5000条。
测试1:用MERGE命令,一次性批量导入;
测试2:对T1表做成游标(Cursor),然后在fetch的循环中,用MERGE命令,逐条纪录进行处理;
测试3:对T1表做成游标(Cursor),然后在fetch的循环中,用SELECT/UPD/INSERT组合,逐条纪录进行处理;
测试2/3更符合此次项目的实际,T2表更新/插入之前,需要对根据T1取得的某些字段值,进行复杂的编辑处理,用测试1的方法很难实现。
测试结果,测试1最快,测试3比测试2快。
②给T1、T2加INDEX,再重做测试。测试结果,还是测试1最快,测试3比测试2快。但这一次的测试,测试2、测试3的结果都比没有INDEX时有明显改善。
③分别用一时表和内存表做测试,速度快慢的顺序不变。
结论:(1)批量导入时,MERGE命令的速度非常快
(2)循环逐条处理的场合,MERGE命令没有性能优势,SELECT/UPD/INSERT组合更快
(3)INDEX对MERGE速度的提升是有作用的。但具体什么场合起作用,此次测试不充分,资料也不足。