<>之前以前只考虑,merge into 只是在特定场合下方便才使用的,今天才发现,merge into 竟然会比,update 在更新数据时有这么大的改进。
其实呢,merge 进部分的更新和更新也没啥不同的,不同的地方在于使用merge 到后执行计划变了。
赶紧测试看看,但是看到下面的结果,我和我的小伙伴惊呆了~
<>前测试数据:
create table  test1 as  select *,得到dba_objects where rownum<=10000;——10000条记录
create table  test2 as  select *,得到dba_objects;——13438条记录
<>之前更新相同的数据,看看下面merge 成和更新相比性能上有何改进。
测试1:更新
完成,,alter system  flush shared_pool;
<>以前系统已更改。
完成,,alter system  flush buffer_cache;
<>以前系统已更改。
完成,set linesize 400年,pagesize 400年
完成,set autot 跟踪
完成set timing
完成,update test1  t1
2,,,,,,set t1.object_name =3,,,,,,,,,,,(select t2.object_name
4,,,,,,,,,,,,,,得到test2 t2
5,,,,,,,,,,,,,where t2.object_id =, t1.object_id);
<>之前已更新10000行。
<>之前已用时间:,,00:25.24,00:,
<>前执行计划
----------------------------------------------------------
Plan hash 价值:,3883393169
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| |,Id 还以为;Operation ,,,,,,,,, |, Name , |, Rows , |, Bytes |, Cost (% CPU) |, Time ,,, |
----------------------------------------------------------------------------
|,,,0,|,UPDATE STATEMENT ,, |,,,,,,, |,, 9606, |,,, 741 k |,,, 518 k , (2) |, 01:43:46 |
|,,,1,|,,UPDATE ,,,,,,,,,,, |, TEST1 |,,,,,,, |,,,,,,, |,,,,,,,,,,,, |,,,,,,,,, |
|,,,2,|,,,TABLE ACCESS 全部|,TEST1 |,, 9606, |,,, 741 k |,,,, 40,,, (0) |, 00:00:01 |
| *,,3,|,,,TABLE ACCESS 全部|,TEST2 |,,, 167, |, 13193, |,,,, 53岁,,,(0)|,00:00:01 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<>以前Predicate 方式;(identified by  operation id):
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<>之前,,,3,安康;过滤器(干净自己的“T2" OBJECT_ID"=: B1)
<>之前注意
-----
,,今天早上,dynamic sampling used for 却;能够statement (要求等级=4)
统计信息
----------------------------------------------------------
,,,,,,,234,,recursive 调用
,,,,,10665,,db block
,,
,,,,,,,335,physical 读取
,,,1631056,,redo 大小
,,,,,,,685,,bytes sent via SQL * Net 用客户端
,,,,,,,705,,bytes received via SQL * Net 得到客户
,,,,,,,,,3,,SQL * Net roundtrips /得到客户
,,,,,,,,,17日,sorts (内存)
,,,,,,,,,0,,sorts (磁盘)
,,,,,10000,,rows 处理
测试2:merge
完成,,alter system  flush shared_pool;
<>以前系统已更改。
<>之前已用时间:,,00:00:,00.33
完成,,alter system  flush buffer_cache;
<>以前系统已更改。
<>之前已用时间:,,00:00:,00.11
完成,merge into test1  t1
2,才能using test2 t2
,,3,,,(=t1.object_id t2.object_id)
4,才能when matched 然后
5,,,,,,update set t1.object_name =, t2.object_name;
10000,行已合并。
<>之前已用时间:,,00:01.14,00:,
<>前执行计划
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null