/*
第一 这个表有2G大小
第二 UNDO空间有32G大,
其次 UPDATE 前 UNDO空间占用很小 忽悠不记
最后 更新表只有关键字和唯一索引
update t_table a
set f_addtime =(select f_addtime from userpaylog where f_username=a.f_username);
commit;
问题是
1 UPDATE 100行数据 并且这100行数据正好在同一个数据块,请问ORACLE是存100次块到UNDO空间吗?
2 UPDATE 时候 是边UPDATE 边维护索引 还是UPDATE完了后(COMMIT后)再维护索引?是指同个SESSION中。
3 像这样可有高效的UPDATE写法?
*/
for i in 1..100 loop
updaet a
set a.name=a.name||'_F';
where id=i;
end loop
commit;
假设A表100行数据 正好存在一个数据块上,那么它要占用多少UNDO块?
假设A表100行数据正好存在5个数据块上,那么它要占用多少UNDO块?
具体说下UNDO块正好可以存100行A表的前映像,我这边的DBA说 ORACLE 是块操作 基本单位是块。
update a set a.name=a.name||'_F' where id=1 ; commit;那么这时候会把该值的前映像放到UNDO块中! 假设是新的UNDO块。
update a set a.name=a.name||'_F' where id=3 ; commit;那么这时候会把该值的前映像放到UNDO哪个块 是上面的块中,还是新申请个空块呢?
如果按照存在同一个块中, 如果A表有20个字段,其实 UNDO只存被更改的字段旧值,外加什么ROWID之类的。 如果这样只有非常小的UNDO空间啊!
可实际中UNDO总是占用很多!
到底ORACLE 10G 它是怎么处理的?
[ 本帖最后由 zengmuansha 于 2010-6-8 11:49 编辑 ]