eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« 新的一年-辛苦的开端 | Blog首页 | Linux上配置Unix ODBC连接Oracle数据库 »

Oracle中,一个Delete操作的流程
modb.pro

Oracle中,一个Delete操作的流程

删除(DELETE)

1.Oracle读Block到Buffer Cache(如果该Block在Buffer中不存在)
2.在redo log buffer中记录delete操作的细节
3.在相应回滚段段头的事务表中创建一个undo条目
4.把将要删除的记录创建前镜像,存放到Undo Block中
5.在Buffer Cache中的相应数据块上删除记录,并且标记相应的数据块为Dirty


提交(COMMIT)
1.Oracle产生一个SCN
2.在回滚段事务表中标记该事务状态为commited
3.LGWR Flush Log Buffer到日志文件
3.如果此时数据块仍然在Buffer Cache中,那么SCN将被记录到Block Header上,这被称为快速提交(fast commit)
4.如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交SCN并写回到Block Header上。这被称为延迟块清除(delayed block cleanout)。


历史上的今天...
    >> 2009-01-03文章:
    >> 2008-01-03文章:
    >> 2006-01-03文章:
           MT Scode 插件错误解决

By eygle on 2005-01-03 23:13 | Comments (9) | FAQ | 139 |

9 Comments

事务not事物

Change it,thanks.

-eygle

4.如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交

下一个访问是指什么?用户访问,还是后台进程访问.
有没可能出现,在获取回滚段信息时,回滚段已经覆盖?

1.指下一次用户访问。
所以说,如果一个延迟块永不被访问,那么将永不被清除。

2.当然可能被覆盖
如果被覆盖,那么可能出现01555错误,更多的是clean out.
clean out 时,undo中的Control SCN非常重要。
参考:
http://www.eygle.com/archives/2005/04/control_scn_of.html

如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。

下一个访问这个block的进程自回滚段中获取该事务的状态有什么作用,结果是什么?

TO 雁渡寒潭:

对于delayed block cleanout,ITL不会被修改,事务记录仍然存在于BLock Header上,下一次访问,需要确认该事务的状态,以确定返回当前数据还是CR读。

metalink上面一篇文章1012431.6,名称是《Overview of Database Fragmentation in Oracle 7》中提到,When you delete a lot of rows and then immediately insert rows, this will cause the table to grow. The reason you see this effect
is because of delayed block cleanout. This will cause fragmentation in the table.

我不明白为什么延迟清除会在large delete然后immediate insert的时候引起碎片。insert把数据插到那个块中是根据freelist决定的,而之前的delete应该把删除以后的free块都记录到了freelist上面,这跟延迟清除有关系吗?

我在9207上作了实验,test表和test1表结构一样都有80万条数据。先delete test; 因为内存很小,机器也慢,所以delete时间很长,中间发了多次checkpoint,然后commit; insert into test select from test1;commit;发现表并没有变大。第2次实验把delete和insert中间的commit去掉了,作成了一个事务。之后发现表变大了1/10,不过通过show_space看那1/10基本上是unused block。

第2次实验为什么会使表变大吗?是因为延迟清除吗?
文档中说的是oracle7的情况,是不是9已经不一样了?

请大师解惑。谢谢!

学习

insert,update 操作的流程有吗?

谢谢


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com