buffer cache的内存结构
链表和Hash算法是Oracle实现内部管理常用的方式。
链表是一种数据结构,通过将对象串联在一起,从而构成链表结构,这样如果要修改,删除或查找某个对象的话,
都可以先到链表中去查找,而不必实际地访问物理介质 。
用户发出SQL语句(假设为 update buff_test set col2='cde' where id=3;), 根据SQL语句的执行计划,相关的数
据块被读入buffer cache, Oracle都会抽取数据块的头部,在内存中构建buffer header, 并将这些buffer header
串成链表,而buffer header里面记录的指针就指向buffer cache中的该数据块本身。 于是Oracle在buffer cache
中搜索某个数据块时,就不用buffer cache中找,而是直接扫描链表上该数据块所对应的buffer header, 然后根据
buffer header所记录的指针就能在buffer cache中直接定位该数据块了。
在library cache中,SQL文本转化为ASCII码,然后使用hash算法计算出对应的hash value.
在buffer cache中,Oracle抽取buffer cache的数据块的头部,在内存中构建buffer header, 然后对buffer header
中记录的数据块地址和数据块类型运用hash函数,得到该数据块所属的组号(hash bucket)。
hash bucket buffer header buffer cache
[0] ---------> [xxx] --------> 每个buffer header中的指针指向buffer cache中的该block本身。
[1] ---------> [xxx]-->[xxx] --------> (这里是两个指针指向...)
[2] ---------> [xxx]-->[xxx]
[3] ---------> [xxx]
[4] ---------> [xxx]-->[xxx]
[5] ---------> [xxx]-->[xxx]-->[xxx] --------> (这里是三个指针指向...)
备注: 上面的buffer header部分的箭头链表被称为hash chain .
当前台发出SQL语句,Oracle根据执行计划找到符合条件的数据块(信息),然后Oracle会根据对请求的数据
块的地址以及数据块的类型做为参数,应用hash函数运算,得到要找的数据块所处的hash bucket, 也就是决定数据
块在哪条hash chain上,然后Oracle进入该hash chain,从上面所挂的第一个buffer header开始,根据buffer
header 指针找到数据块体,扫描其中数据,确认是否是SQL语句需要的块,如果是,则返回该块所需要的数据;
否则继续向下搜索直到最后一个buffer header为止,如果一直都没有找到,则调用物理I/O, 到磁盘上数据文件
上把该块所含有的内容复制一份到一个可用的buffer里,同样构建该块的buffer header, 然后根据hash值将buffer
header 挂到hash chain上去。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-664577/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-664577/