update 大表时候 undo 空间为什么比表还大呢?

[复制链接]
查看11 | 回复9 | 2007-9-26 18:42:10 | 显示全部楼层 |阅读模式
/*
第一 这个表有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 编辑 ]
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
ding!!!!!!!
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
没事更新大表干嘛?
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
1.是100条数据到undo。
但是如果你用100个事务做了100行数据的update,那么undo就要100个数据块了。
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
原帖由 tam509 于 2010-4-2 18:00 发表
。。。。但是如果你用100个事务做了100行数据的update,那么undo就要100个数据块了。

为啥undo需要100个数据块?
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
不同的事务产生的undo不能放在同一个block里吗?
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
我就一个事务 update table set。。。。会更新100条数据 是否把这个块 存100次到UNDO
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
原帖由 我上面有人 于 2010-4-2 18:04 发表
不同的事务产生的undo不能放在同一个block里吗?

不同事务用一个数据块,那如何把这些事务区分开呢?
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
原帖由 zengmuansha 于 2010-4-2 17:49 发表
2 UPDATE 时候 是边UPDATE 边维护索引 还是UPDATE完了后(COMMIT后)再维护索引?是指同个SESSION中。

2.边update边维护索引。有索引的话,undo暴增
回复

使用道具 举报

千问 | 2007-9-26 18:42:10 | 显示全部楼层
原帖由 tam509 于 2010-4-2 18:21 发表
不同事务用一个数据块,那如何把这些事务区分开呢?

分开作甚?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行