对象有多少个数据块缓冲在Data buffer中
为了详细说明具体的情况,先创建一个测试表,并且插入一定的记录进去。
可以看到,数据块其实只占用了8个块,但是表合计占用了16个数据块,另外8个块是什么呢,它们是段头,位图块等,是表中的额外开销。至于这些块的详细信息,在本书的表空间与数据分布一章会有详细介绍,现在只需要知道,该表有16个block,数据块占了8个。
注意:以上通过Rowid查询使用了哪些数据块,只适合没有发生行迁移与行链接的情况下,如新创建的表,插入的小记录是适合的。如果发生了行迁移与行链接,因为Rowid本身不发生变化,而数据块的使用却会发生变化。
那么,现在分别查询一下x$bh与v$bh,看看它们中间保存了几条记录。
FILE# DBABLK TCH 16 rows selected. Piner@10gR2>select file#,block#,status from v$bh where objd= FILE# BLOCK# STATUS 16 rows selected. |
可以看到,这两个查询都返回了16条记录,从块9到块24,中间包含了数据块所在的8个块。至于为什么从块9开始,在本书的后面也会有解释,因为本地管理的数据文件头部,有8个保留块。
看x$bh,返回了块的触摸(touch count)信息,表示了一个块的热点程度,现在最热的是数据块11,它并不是数据块,而是段头,通过如下查询也可以证明:
看v$bh,返回了块的状态信息,这里是xcur,表示排斥状态,被当前instance独占,也就是该块正在被使用。常见的状态还有scur,表示被instance共享;cr,表示一致性读;free表示空闲状态;read,表示正在从磁盘上读取;write,表示正在被写入。至于v$bh的这些状态,也是从x$bh中通过decode函数根据字段state解释过来的,所以能看得更明白一些。
如果这个时候,手工清除一次Data buffer,会发生什么情况呢?
可以看到,x$bh中的块的tch都恢复到0了,而v$bh中的状态也都变成free了,但是记录数并没有发生变化,也就是说,数据块虽然被刷到磁盘上去了,数据块的记录指针只不过是简单地被清空而已。
源 http://holyane.blog.163.com/blog/static/4192717220099161104576/
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21340813/viewspace-1028127/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21340813/viewspace-1028127/