|
噢
1: 更新前的数据一定会保存在回滚段数据文件中,但是也很可能在 数据缓冲区 中,当出现很大很大的更新事务的时候,SGA中可能有大量 回滚段block,但到底会有多少,oracle决定的,我不清楚。但也有可能存在着回滚段中有而SGA中没有的,因为毕竟SGA有限。查询需要获取新数据块的时候就可能 clear 这些回滚段block
。
2:被更新的dirty buffer 的数量总是不会太多,会触发检查点
3:回滚段不是 DBWR 写的,回滚段应该是 server process写的,redo buffer 也是 server process写的,lgwr 是写 buffer 进文件
4: ora-01555 是因为 回滚段已经被覆盖了,而和 SGA中是否有回滚段数据无关
如果你要研究回滚段到底能占SGA多大的比例,你可以通过 sys.x$bh 来研究
sqlplus 0 :
注意,回滚段块的class = 12 + 2*n ,n 为回滚段编号 :
SQL> select class,count(*) from x$bh group by class;
CLASS COUNT(*)
---------- ----------
1 1792
4 73
9 2
10 2
11 1
13 1
14 1
15 1
16 1
17 1
18 80
CLASS COUNT(*)
---------- ----------
19 1
20 79
21 1
22 2
23 1
24 2
25 1
26 1
29 1
30 4
21 rows selected.
sqlplus 1 :
SQL> update t set owner = owner ;
25374 rows updated.
SQL> commit;
Commit complete.
SQL>
sqlplus 0 :
SQL> select class,count(*) from x$bh group by class;
CLASS COUNT(*)
---------- ----------
1 1685
4 55
9 2
10 2
11 1
13 1
14 187 回滚段块增加,回滚段编号是1,12+2*1 = 14
15 1
16 1
17 1
18 61 回滚段块减少
CLASS COUNT(*)
---------- ----------
19 1
20 42 回滚段块减少
21 1
22 1
23 1
24 1
25 1
26 1
29 1
30 1
21 rows selected.
sqlplus 2 :
SQL> update t set owner = owner ;
25374 rows updated.
SQL>
sqlplus 0 :
QL> select class,count(*) from x$bh group by class;
CLASS COUNT(*)
--------- ----------
1 1421
4 43
11 1
13 1
14 235
15 1
16 234 回滚段块增加,上个回滚段编号是1,这次是2,12+2*2 = 16
17 1
18 60
19 1
20 42
CLASS COUNT(*)
--------- ----------
21 1
22 1
23 1
24 1
25 1
26 1
29 1
30 1
9 rows selected.
QL> |
|