第七章 Redo and Undo (二)
oracle dba redo undo
日月明王BLOG: http://sunmoonking.spaces.live.com/
INDEX 对UNDO的影响
INSERT只产生很少的UNDO,因为只需要记录ROWID就可以在ROLLBACK的时候UNDO。
UPDATE一般排在第二位,因为一般不会UPDATE一条记录里的所有值。
DELETE产生的UNDO是最多的,因为DELETE后UNDO需要保存所DELETE的整条记录。
UNDO使用的大小和INDEX有很大关系。
SQL> create table wwm as
2 select object_name unindexed,object_name indexed
3 from all_objects;
表已创建。
SQL> create index t_wwm on wwm(indexed);
索引已创建。
SQL> exec dbms_stats.gather_table_stats('SYS','WWM');
PL/SQL 过程已成功完成。
select used_ublk
from v$transaction
where addr = (select taddr
from v$session
where sid = (select sid
from v$mystat
where rownum = 1
)
)
未选定行
SQL> update wwm set unindexed=lower(unindexed);
已更新29138行。
SQL> select used_ublk
2 from v$transaction
3 where addr = (select taddr
4 from v$session
5 where sid = (select sid
6 from v$mystat
7 where rownum = 1
8 )
9 )
10 /
USED_UBLK
----------
399
看到这次更新用了399个BLOCK去存储UNDO信息
SQL> commit;
提交完成。
SQL> select used_ublk
2 from v$transaction
3 where addr = (select taddr
4 from v$session
5 where sid = (select sid
6 from v$mystat
7 where rownum = 1
8 )
9 )
10 /
未选定行
COMMIT后UNDO被释放。
然后在UPDATE有索引的列.
SQL> update wwm set indexed=lower(indexed);
已更新29138行。
SQL> select used_ublk
2 from v$transaction
3 where addr = (select taddr
4 from v$session
5 where sid = (select sid
6 from v$mystat
7 where rownum = 1
8 )
9 )
10 /
USED_UBLK
----------
1132 看到在有INDEX上做UPDATE会产生4倍左右的UNDO.
本文探讨了在Oracle数据库中,不同类型的SQL操作如何影响UNDO的使用情况,并特别强调了INDEX的存在对于UPDATE操作产生的UNDO量的影响。通过具体实验展示了在有索引的列上进行UPDATE操作时,产生的UNDO大小会显著增加。

被折叠的 条评论
为什么被折叠?



