QUOTE:
原帖由
sqysl 于 2008-5-24 22:28 发表

首先,谢谢晶晶女侠,学习了,我再确定一下,那你的意思就是:
先进行扫描,扫描到符合修改条件的数据-->获取一个事务表项-->获取一个块ITL-->加锁-->进行数据的修改,是吗?在扫描到符合修改条件的数据前,即不获取事务表项,也不获取块上的ITL,对吗?
是的。这里还有一个实验,可以证明不修改任何行的DML,根本不会访问回滚段头:
sid=36 pid=22> select tch,DBARFIL, DBABLK from x$bh a,(select header_file hf, header_block hb from dba_segments a , v$rollname b where a.segment_name=b.name) b where a.dbarfil=b.hf and a.dbablk=b.hb;
TCH DBARFIL DBABLK
---------- ---------- ----------
61 1 9
43 7 9
42 7 25
41 7 41
这上面显示的是回滚段头的TCH值。DBARFIL 是1的行,是系统回滚段,我们不必看它。主要看下面三行,TCH值分别是43,42,41,注意,相差1。
多观察几次:
sid=36 pid=22> /
TCH DBARFIL DBABLK
---------- ---------- ----------
62 1 9
44 7 9
43 7 25
42 7 41
我观察了很多次,三个回滚段头的TCH值,都是相差1。
下面发出一个更新0行的DML:
sid=43 pid=19> update test1 set object_name='abcdefg' where object_name='9AAh';
已更新0行。
再到36号会话中观察回滚段头的TCH:
sid=36 pid=22> /
TCH DBARFIL DBABLK
---------- ---------- ----------
64 1 9
46 7 9
45 7 25
44 7 41
sid=36 pid=22> /
TCH DBARFIL DBABLK
---------- ---------- ----------
65 1 9
47 7 9
46 7 25
45 7 41
多观察几次,
sid=36 pid=22> /
TCH DBARFIL DBABLK
---------- ---------- ----------
70 1 9
54 7 9
53 7 25
52 7 41
每个回滚段头的TCH始终都是相差1。这证明更新0行的DML并没有访问任何一个回滚段头。
下面,发出一个更新了1行的DML
sid=43 pid=19> update test1 set object_name='abcdefg' where object_name='abcdefg';
已更新 1 行。
sid=36 pid=22> /
TCH DBARFIL DBABLK
---------- ---------- ----------
71 1 9
55 7 9
55 7 25
53 7 41
sid=36 pid=22> /
TCH DBARFIL DBABLK
---------- ---------- ----------
72 1 9
56 7 9
56 7 25
54 7 41
第三行的回滚段头的TCH值发生了变化。
先说这么多吧。这个实验证明,UPDATE 零行的话,是不访问回滚段头的。