关于DATA BUFFER的想法

[复制链接]
查看11 | 回复9 | 2007-5-10 01:02:02 | 显示全部楼层 |阅读模式
ORACLE在取数的时候会首先在DATA BUFFER中查找是否有需要的数据,如果都有,就避免从物理磁盘中读取,直接从DATA BUFFER中取到数据,这个时候就只有逻辑读而无物理读了,这个也就是经常看到的查询小表,第二次比第一执行快,并且看不到物理读的原因。
不过我想知道的是ORACLE做出这个判断,可以知道都在DATA BUFFER而不要去磁盘中确认,是根据数据字典的信息来判断的吗,比如数据字典中文件ID及块ID吗
可以判断的如此准确,都不用去磁盘中核对一下有没搞错:)
回复

使用道具 举报

千问 | 2007-5-10 01:02:02 | 显示全部楼层
看来你对data buffer还不够了解或者说一点都不了解。
oracle在取数据的时候 是先去data buffer中寻找,如果没有找到,就直接去物理块上读,读出来后就会在data buffer中保留一个副本。
而在data buffer中有一个(或者几个)list 列表,oracle在判断data buffer中有无需要的数据时,会直接去读这个list。
在保留那个副本之前,oracle会先判断data buffer是否有足够的空间来保存这个副本,如果空间吃紧,就会触发dbwr进程刷出脏数据,
而保留在data buffer中的数据,一旦被修改就会从先前的list上,移动到dirty list上,这个list上面的数据都是准备刷出到磁盘的脏数据。
[ 本帖最后由 oracle_qht 于 2010-5-8 12:45 编辑 ]
回复

使用道具 举报

千问 | 2007-5-10 01:02:02 | 显示全部楼层
谢谢!
我想说的的是凭什么认为在BUFFER区就找到所有你要的了,不知能否明白我的意思
回复

使用道具 举报

千问 | 2007-5-10 01:02:02 | 显示全部楼层
呵呵,2楼没明白LZ的意思。
先到buffer找,没找到,再去磁盘找, 这就说明这个时候ORACLE已经知道需要哪些块了。既然知道了,当然就知道什么buffer是在内存的,什么不在内存而去需要去读物理BLOCK了。
至于怎么判断,这个其实比较简单,每个block都有号码,用HASH算法就可以快速判断了。
回复

使用道具 举报

千问 | 2007-5-10 01:02:02 | 显示全部楼层
要用数据字典来参考吧:)
回复

使用道具 举报

千问 | 2007-5-10 01:02:02 | 显示全部楼层
你愿怎么想就怎么想
回复

使用道具 举报

千问 | 2007-5-10 01:02:02 | 显示全部楼层
先充buffer里面去找 能找到就OK 不行就去磁盘上找 产生物理读
回复

使用道具 举报

千问 | 2007-5-10 01:02:02 | 显示全部楼层
原帖由 huanhuanlove 于 2010-5-8 16:44 发表
先充buffer里面去找 能找到就OK 不行就去磁盘上找 产生物理读

不去磁盘中寻找,怎么知道内存中已经全部满足条件了,这个话虽然如此说,但是思考下去,还是很有讲究的啊
就是有种算法可以做到这点,我猜测是依赖数据字典的块头文件头等的判断。。。。。
不过细究起来,应该很有学问啊。。。。
回复

使用道具 举报

千问 | 2007-5-10 01:02:02 | 显示全部楼层
数据字典有信息记录了buffer中的块,至于是什么视图,我怀疑是v$bh,具体是什么视图,希望大牛们能指点下
回复

使用道具 举报

千问 | 2007-5-10 01:02:02 | 显示全部楼层
原帖由 fjliangrq 于 2010-5-8 16:58 发表

不去磁盘中寻找,怎么知道内存中已经全部满足条件了,这个话虽然如此说,但是思考下去,还是很有讲究的啊
就是有种算法可以做到这点,我猜测是依赖数据字典的块头文件头等的判断。。。。。
不过细究起来,应该很有学问啊。。。。

什么是数据字典? 真正的数据字典是内存的一个直接映像,访问内存和字典有什么区别?
我们看到很多字典,是由ORACLE经过处理的,已经不属于第一层。x$应该属于第一层,这个其实就是内存的反应,难道你认为字典和内存有区别?
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行