我试图查看不同插入语句生成的重做数量。 我看到,对于事务中的第一个插入,重做大小显示为零。 下一个插入生成一个2664字节的重做(可能是最后两个插入)。 所有后续插入都会生成预期的重做次数。
我使用的数据库是10.2.0.4
create table temp (
x int, y char(1000), z date);
Table created.
set autotrace traceonly statistics;
sql> insert into temp values (1, user, sysdate );
1 row created.
Statistics
----------------------------------------------------------
1 recursive calls
5 db block gets
1 consistent gets
0 physical reads
0 redo size
358 bytes sent via SQL*Net to client
319 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
- 仅显示后续插入的重做大小...
sql> insert into temp values (2, user, sysdate);
1 row created.
Statistics
------------
2664 redo size
sql> insert into temp values (3, user, sysdate);
1 row created.
Statistics
----------------------------------------------------------
1300 redo size
sql> insert into temp values (4, user, sysdate);
1 row created.
Statistics
----------------------------------------------------------
1368 redo size
有人可以解释为什么会这样吗?
谢谢,
拉杰什。
答案 0 :(得分:1)
转载于XE。
如果您使用Google“In Memory Undo”和“Private Redo Threads”,那么可能会有一些相关的讨论。 EG this
“对于”小“交易,10g 生成私有重做但没有 将更改应用于块直到 提交。但是国旗 (x $ bh.flag)将第3位设置为1来显示 那个私人重做是存在的 块。
提交时,重做是 应用于块,此时 块被标记为脏, 私有重做然后被复制到 公共重做缓冲区和LGWR已发布 将重做写入光盘。 (该 处理相关的撤销块 是类似的。“
答案 1 :(得分:1)
实际上,由于加里指出的私人重做机制,这个问题已经出现了。 但是,在生成大量红色后,更改将被推送到公共线,而不是在提交之后。
此问题已在Oracle技术论坛上得到解答。 请阅读Jonathan Lewis和Tanel Poder在以下主题中的评论。 http://forums.oracle.com/forums/thread.jspa?messageID=3915905�