merge和update到底有什么区别

浏览: 3767

背景

一条update语句的优化引起风波,有人说merge比update快,有人说merge只是功能上和update有所不同,性能上应该没什么区别。

简介

update:更新命令

merge: 指定条件下,匹配与不匹配时执行指定动作(update或insert)

语法


merge_update_clause ::=

Description of merge_update_clause.gif follows

merge_insert_clause ::=

Description of merge_insert_clause.gif follows

where_clause::=

Description of where_clause.gif follows

From: http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9016.htm#SQLRF01606


从语法可以看出merge支持对同一个表做update和insert操作,这一点和update是功能上的最大差异。

抛开insert的情况,我们单看update的效率来做个实验

实验一

创建测试表

create table ltztest as select * from dba_objects; ---76283rows
create table test_dba_object as select * from ltztest;---76283rows

执行update测试语句

update ltztest a
   set a.status =
       (select t.status
          from test_dba_object t
         where a.object_id = t.OBJECT_ID)
 where a.object_id = t.OBJECT_ID; ---532.291s 76283rows

Clipboard Image.png

执行merge测试语句

merge into ltztest a
using test_dba_object t1
on (a.object_id = t1.OBJECT_ID)
when matched then
  update set a.status = t1.status; ---0.452s 76282rows

Clipboard Image.png

结果

单从执行SQL的时间上就可以看得出merge的效率要远高于update

从执行计划上来看,

update是对两个表扫描后没有关联,做的最基本的loop,执行次数是x * x (可以自行做10053看下)。

merge将两个表做了哈希连接,然后再做merge的update操作,执行次数是x (可以自行做10053看下) 

正因如此,merge效率提高了x倍

https://community.oracle.com/thread/493516

但是并不是所有的情况下merge都比update要快

实验二

未完待续

推荐 10
本文由 老头子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

4 个评论

merge有多块读,不过也有缺点,比如存储过程中sql%rowcount,可就分不清是delete,还是update,还是insert 了。
这个好,有些情况下确实使用merge快多了
merge是否多块读还待验证,我也听闻过这个说法,但是我做简单的监控等待事件两者是一样的,更详细的跟踪还没做
这个有用。

要回复文章请先登录注册