SQL> create table test2(a number, b number);
表已创建。
SQL> create table test3(a number, b number);
表已创建。
SQL> insert into test2 values (1,100);
已创建 1 行。
SQL> insert into test2 values (2,200);
已创建 1 行。
SQL> commit;
提交完成。
SQL> merge into test3
2 using test2
3 on (test2.a = test3.a)
4 when not matched then --没有匹配则插入
5 insert
6 values (test2.a, test2.b);
2 行已合并。
SQL> select * from test3;
A B
---------- ----------
1 100
2 200
SQL> merge into test3
2 using test2
3 on (test2.a = test3.a)
4 when matched then --匹配了更新
5 update
6 set test3.b = test2.b + 100
7 when not matched then
8 insert
9 values (test2.a, test2.b);
2 行已合并。
SQL> select * from test3;
A B
---------- ----------
1 200
2 300
COLUMN_VALUE
-----------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time
uffers |
-----------------------------------------------------------------------------
| 1 | MERGE | TEST3 | 1 | | 2 |00:00:00.01
8 |
| 2 | VIEW | | 1 | | 2 |00:00:00.01
6 |
COLUMN_VALUE
-----------------------------------------------------------------------------
|* 3 | HASH JOIN OUTER | | 1 | 2 | 2 |00:00:00.01
6 |
| 4 | TABLE ACCESS FULL| TEST2 | 1 | 2 | 2 |00:00:00.01
3 |
| 5 | TABLE ACCESS FULL| TEST3 | 1 | 2 | 2 |00:00:00.01
3 |
-----------------------------------------------------------------------------
COLUMN_VALUE
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("TEST2"."A"="TEST3"."A")
Note
-----
- dynamic sampling used for this statement
上面是merge语句的执行计划,可以看出两张表通过hash join连接到一起,test2为构造输入构造为哈希表,test3为探测输入,
探测输入的每一行都会被拿来对哈希表进行探测以找出匹配的行。在这条sql中如果匹配了就进行update否则进行insert。
也可以加where条件,是针对test2表加的
SQL> merge /*+ gather_plan_statistics*/into test3
2 using test2
3 on (test2.a = test3.a)
4 when matched then
5 update
6 set test3.b = test3.b + 100
7 where test2.a = 23 --意思是在匹配的情况下test2.a = 23的才更新
8 when not matched then
9 insert
10 values (test2.a, test2.b)
11 ;
0 行已合并。
COLUMN_VALUE
-----------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time
uffers |
-----------------------------------------------------------------------------
| 1 | MERGE | TEST3 | 1 | | 2 |00:00:00.01
6 |
| 2 | VIEW | | 1 | | 2 |00:00:00.01
6 |
COLUMN_VALUE
-----------------------------------------------------------------------------
|* 3 | HASH JOIN OUTER | | 1 | 2 | 2 |00:00:00.01
6 |
| 4 | TABLE ACCESS FULL| TEST2 | 1 | 2 | 2 |00:00:00.01
3 |
| 5 | TABLE ACCESS FULL| TEST3 | 1 | 2 | 2 |00:00:00.01
3 |
-----------------------------------------------------------------------------
COLUMN_VALUE
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("TEST2"."A"="TEST3"."A")
Note
-----
- dynamic sampling used for this statement
COLUMN_VALUE
-----------------------------------------------------------------------------
已选择27行。
可以看到没有对where条件,test2.a = 23进行过滤的谓词信息,这个仅仅在UPDATE的时候才判断。可以说发生在步骤1 (MERGE)
如果放到ON里面,意义就变了,可能会发生不必要的INSERT。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25361369/viewspace-712118/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25361369/viewspace-712118/