关于回滚段的疑问

[复制链接]
查看11 | 回复7 | 2007-4-9 11:34:42 | 显示全部楼层 |阅读模式
假设我现在做一个UPDATE TABLE SET COL1=1000;
这个操作有一百万行,操作的时间比较长.然后成功了.
这个时间,数据应该有两份.一份是在回滚段上的老数据,一份是在原数据文件里的新数据.如果这个时间COMMIT的话,没有问题.数据文件不变,而UNDO上的数据就可以被覆盖了.
但如果这个时间ROLLBACK呢,应该是UNDO上的数据写回数据文件里.ROLLBACK的操作一般都是一刹那的.我的理解是ORACLE会先ROLLBACK,然后会在数据文件中的新数据文件中打个标记,也就是说它已经被取消.这个时间,原数据会从UNDO上慢慢的写回.这个时间如果再有对原数据进行更改,会从UNDO中取数据再UNDO.
但是,我的疑问是从UNDO中写回数据是在怎么的情况下完成的.多久,ORACLE是怎么控制的.还有写回的数据文件是放在原数据文件的位置吗,而且,假设是INSERT的话,我插入一百万条记录,又ROLLBACK的话,HVM是怎么样的,回到原来的位置,还是停在ROLLBACK前的位置.
谢谢.
回复

使用道具 举报

千问 | 2007-4-9 11:34:42 | 显示全部楼层
.ROLLBACK的操作应用UNDO上的数据写回数据文件里,ROLLBACK的操作不是一刹那的:
当执行大量插入后,进行回滚,可以看到 V$TRANSACTION 中ubablk 的变化基本是 insert 时反向变化;并且需要一段时间;HVM停在在ROLLBACK前的位置
回复

使用道具 举报

千问 | 2007-4-9 11:34:42 | 显示全部楼层
ROLLBACK的操作一般都是一刹那的??你可以测试一下一个大的update再rollback,看看时间有多少。rollback的代价是很大的。
假设是INSERT的话,我插入一百万条记录,又ROLLBACK的话,HVM是怎么样的,回到原来的位置,还是停在ROLLBACK前的位置.
做个测试不就知道了。
回复

使用道具 举报

千问 | 2007-4-9 11:34:42 | 显示全部楼层
不是HVM是HWM


回复

使用道具 举报

千问 | 2007-4-9 11:34:42 | 显示全部楼层
V$TRANSACTION 中ubablk 我从哪张表里可以对应出具体的BLOCK,谢谢.
回复

使用道具 举报

千问 | 2007-4-9 11:34:42 | 显示全部楼层
那是不是ROLLBACK一定是等到全部回滚完毕了,才结束的.
回复

使用道具 举报

千问 | 2007-4-9 11:34:42 | 显示全部楼层
ROLLBACK相对于原先的DML操作来说,总是快了不少的.这是为什么.
回复

使用道具 举报

千问 | 2007-4-9 11:34:42 | 显示全部楼层
最初由 uj12 发布
[B]ROLLBACK相对于原先的DML操作来说,总是快了不少的.这是为什么. [/B]

可能会快一点吧
特别是update.
update有一个table scan的动作(搜索需要更新的块),而rollback没有,所以可能快一点。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836