关于hash chain上搜索块的问题,谢谢

[复制链接]
查看11 | 回复7 | 2008-1-2 17:35:53 | 显示全部楼层 |阅读模式
在搜索hash chain上的块时,如果发现块已经在chain上了,可能需要比较已经存在的锁定模式和当前的锁定模式是否兼容,我想问下:
1、这里的“锁定模式”指的是独占锁、共享锁之类的吗?
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
是的。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
那如果搜索一个块,它已经存在,什么情况下会复制一个块给当前的查询使用?谢谢……
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
在buffer cache中获取所需要的数据块的过程
当前台进程发出SELECT或者其他DML语句时,oracle根据SQL语句的执行计划所找到的数据块,会构造一个名为数据块描述(buffer descriptor)的内存结构。该buffer descriptor位于session的PGA中,所包含的内容主要是数据块所在的物理地址、数据块的类型、数据块所属对象的object id等信息。
随后,oracle会把对数据块请求的锁定模式以及所构造出来的buffer descriptor传入专门搜索数据块的函数中。在该函数中,oracle根据buffer descriptor所记录的信息,应用hash算法以后,得到要找的数据块所处的hash bucket,也就是确定该数据块在哪条hash chain上。然后,oracle进入该hash chain,从上面所挂的第一个buffer header开始搜索,一直搜索到最后一个buffer header。
在hash chain上搜索的逻辑如下:
1) 比较buffer header上所记录的数据块的地址,如果不符合,则跳过该buffer header。
2) 跳过状态为CR的buffer header。
3) 如果遇到状态为READING的buffer header,则等待,一直等到该buffer header的状态改变以后再比较所记录的数据块的地址是否符合。
4) 如果发现数据块地址符合的buffer header,则查看该buffer header是否位于正在使用的列表上,如果是,则判断已存在的锁定模式与当前所要求的锁定模式是否兼容,如果是,则返回该buffer header所记录的数据块地址,并将当前进程号放入该buffer header所处的正在使用的列表上。
5) 如果发现锁定模式不兼容,则根据找到的buffer header所指向的数据块的内容,构建一个新的、内容一样的、状态为XCURRENT的复制数据块,并且构造一个状态为CR的buffer header,同时该buffer header指向所新建立的复制数据块。然后,返回该复制数据块的地址,并将当前进程号放入该buffer header所处的正在使用的列表上。
6) 如果比较完整个hash chain以后还没发现所要找的buffer header,则从磁盘上读取数据文件。并将读取到的数据块所对应的buffer header挂到hash chain上。
有点不明白的是
1,状态为CR的buffer header是什么意思?
2,SQL语句的执行计划怎么知道要找的数据的物理地址的?是根据数据字典吗?
3,buffer header所处的正在使用的列表上?
4,ORACLE读取很大的表时候一次读取多少个块?
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
CR状态表示的current块:说明数据库正在从数据文件往该块中写入数据,因而直接在2)中跳过;
SQL语句的执行计划在解析的时候需要知道object 是否存在以及用户是有有权限在该object上执行SQL,会从ldictionary cache中读取该object的字典信息;
(3,buffer header所处的正在使用的列表上?
(4,ORACLE读取很大的表时候一次读取多少个块?)有些模糊。。看不明白。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
jimn1982,
Where did you get the information about "buffer descriptor"? How did you find it? If you copied the article from somewhere else, please tell us the location.
As far as I know, the term "buffer descriptor" is rarely used. When it *is* used, it simply refers to buffer header (BH). But buffer header exists all the time, not created at the time a query or DML starts.
Yong Huang
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
May be come from "hanson"
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
原帖由 microsoft_fly 于 2010-2-4 03:13 发表
May be come from "hanson"

Hanson who? Full name and web site if you know.
Yong Huang
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行