更新操作中的外关联(二)
上一篇 / 下一篇 2008-05-23 23:52:57 / 个人分类:ORACLE
今天同事和我说,UPDATE一个表的时候,这个表和其他表进行外关联获取更新数据无效。
简单描述一下UPDATE中为什么无法使用外关联,并对比几种方式的执行计划和性能。
更新操作中的外关联(一):http://yangtingkun.itpub.net/post/468/462581
上面一篇文章中,给出了更新中需要外关联的几种解决方法,并根据经验对性能进行了判断。不过上一篇文章没有解释为什么UPDATE语句中被更新的表不能和其他表进行外关联,其实答案很简单,Oracle的UPDATE更新执行计划不支持这种写法:
SQL> SELECT * FROM T_UPDATE;
ID FID NAME AGE
^ Kn)V8F!W0---------- ---------- ------------------------------ ----------ITPUB个人空间 V
r5K'h.]
1
2 B 2
SQL> SELECT * FROM T_PRIMARY;
ID NAME AGEITPUB个人空间0w#Y%V$pW*|&pdl
---------- ------------------------------ ----------ITPUB个人空间^_ k"I8Sq/R(k
ZH
SQL> SET AUTOT ONITPUB个人空间YO Lb!m']
SQL> UPDATE T_UPDATE AITPUB个人空间-EH#u4A0Uk-v1HT
2 SET NAME =ITPUB个人空间HS5]SEl]7w/x2E
3 (
w
PY6YUt`|xdZ0 4 SELECT NVL(B.NAME, 'NULL')
a:a(X
]U;U#`0 5 FROM T_PRIMARY BITPUB个人空间_w0\q'{3T3gw
6 WHERE A.FID = B.ID(+)
#Z&@9`*RGP'{0 7 );
已更新2行。
jl
?8t+h8BT:L._h0执行计划ITPUB个人空间h9s"s_Ee}QG
----------------------------------------------------------
};{m1qMXhQ9x
W0Plan hash value: 1794350833
--------------------------------------------------------------------------------------------
Y? `-A|gr0| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
x8xi#yl"P0--------------------------------------------------------------------------------------------ITPUB个人空间TF5~SuF
| 0 | UPDATE STATEMENT | | 2 | 60 | 2 (0)| 00:00:01 |ITPUB个人空间d.G3|+U%M"F!j
| 1 | UPDATE | T_UPDATE | | | | |
Y/^a[xs5x(E0| 2 | TABLE ACCESS FULL | T_UPDATE | 2 | 60 | 2 (0)| 00:00:01 |
fD~;X+\|%Jm]0| 3 | TABLE ACCESS BY INDEX ROWID| T_PRIMARY | 1 | 30 | 1 (0)| 00:00:01 |
-L!w+mtZ2|Kv0|* 4 | INDEX UNIQUE SCAN | SYS_C0019519 | 1 | | 1 (0)| 00:00:01 |ITPUB个人空间3i-B(^,KG+]1V
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):ITPUB个人空间)mpmZ
~V0t%b
---------------------------------------------------
4 - access("B"."ID"(+)=:B1)
NoteITPUB个人空间![Q!~h9[g
-----
sW
e3Z2N0 - dynamic sampling used for this statement
)iGl8|7Y
wIyD-@0统计信息ITPUB个人空间7LGbz:c9o)d
----------------------------------------------------------
(RQ'N3@tV;T0 0 recursive calls
C6S}0A*B/u0 3 db block getsITPUB个人空间vOZji8K+i)v
9 consistent gets