千家信息网

如何深度分析oracle buffer cache的概念以及内存结构

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章给大家介绍如何深度分析oracle buffer cache的概念以及内存结构,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.buffer cache的概念用最简单的语
千家信息网最后更新 2025年12月02日如何深度分析oracle buffer cache的概念以及内存结构

这篇文章给大家介绍如何深度分析oracle buffer cache的概念以及内存结构,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。


1.buffer cache的概念
用最简单的语言来描述oracle数据库的本质,其实就是能够用磁盘上的一堆文件来存储数据,并提供了各种各样的手段对这些数据进行治理。作为治理数据的最基本要求就是能够保存和读取磁盘上的文件中的数据。众所周知,读取磁盘的速度相对来说是非常慢的,而内存相对速度则要快的多。因此为了能够加快处理数据的速度,oracle必须将读取过的数据缓存在内存里。而oracle对这些缓存在内存里的数据起了个名字:数据高速缓存区(db buffer cache),通常就叫做buffer cache。按照oracle官方的说法,buffer cache就是一块含有许多数据块的内存区域,而这些数据块主要都是数据文件里的数据块内容的拷贝。通过初始化参数:buffer_cache_size来指定buffer cache的大小。oracle实例一旦启动,该区域大小就被分配好了。

buffer cache所能提供的功能主要包括:
1)通过缓存数据块,从而减少I/O。
2)通过构造CR块,从而提供读一致×××。
3)通过提供各种lock、latch机制,从而提供多个进程并发访问同一个数据块的功能。
2.buffer cache的内存结构

2.1 buffer cache概述
oracle内部在实现其治理的过程中,有两个非常有名的名词:链表和hash算法。
链表是一种数据结构,通过将对象串连在一起,从而构成链表结构。这样,假如要修改、删除、查找某个对象的话,都可以先到链表中去查找,而不必实际的访问物理介质。oracle中最有名的链表大概就是LRU链表了,我们后面会介绍它。

而hash算法则是为了能够进行快速查找定位所使用一种技术。所谓hash算法,就是根据要查找的值,对该值进行一定的hash算法后得出该值所在的索引号,然后进入到该值应该存在的一列数值列表(可以理解为一个二维数组)里,通过该索引号去找它应该属于哪一个列表。然后再进入所确定的列表里,对其中所含有的值,进行一个一个的比较,从而找到该值。这样就避免了对整个数值列表进行扫描才能找到该值,这种全扫描的方式显然要比hash查找方式低效很多。其中,每个索引号对应的数值列在oracle里都叫做一个hash bucket。

我们来列举一个最简单的hash算法。假设我们的数值列表最多可以有10个元素,也就是有10个hash buckets,每个元素最多可以包含20个数值。则对应的二维数组就是t[10][20]。我们可以定义hash算法为n MOD 10。通过这种算法,可以将所有进入的数据均匀放在10个hash bucket里面,hash bucket编号从0到9。比如,我们把1到100都通过这个hash函数均匀放到这10个hash bucket里,当查找32在哪里时,只要将32 MOD 10等于2,这样就知道可以到2号hash bucket里去找,也就是到t[2][20]里去找,2号hash bucket里有10个数值,逐个比较2号hash bucket里是否存在32就可以了。

buffer cache就是使用多个hash bucket来治理的,其hash算法当然比我们前面列举的要复杂多了。
从逻辑上说明了整个buffer cache的结构是怎么样的。

列出三个名词:hash bucket、buffer header和hash chain。
这里的hash bucket就是我们前面说明hash算法中提到的二维数组的第一维。它是通过对buffer header
里记录的数据块地址和数据块类型运用hash算法以后,得到的组号。
这里的hash chain就是属于同一个hash bucket的所有buffer header所串起来的链表。实际上,hash
bucket只是一个逻辑上的概念。每个hash bucket都是通过不同的hash chain而体现出来的。每个hash chain都会由一个cache buffers chains latch来治理其并发操作。

而对于buffer header来说,每一个数据块在被读入buffer cache时,都会先在buffer cache中构造一个buffer header,buffer header与数据块一一对应。buffer header包含的主要信息有:
1)该数据块在buffer cache中实际的内存地址。就是上图中的虚线箭头所表示的意思。
2)该数据块的类型,包括data、segment header、undo header、undo block等等。
3)该buffer header所在的hash chain,是通过在buffer header里保存指向前一个buffer header的指针和指向后一个buffer header的指针的方式实现的。
4)该buffer header所在的LRU、LRUW、CKPTQ等链表(这些链表我们后面都会具体说明)。也是通过记录前后buffer header指针的方式实现。
5)当前该buffer header所对应的数据块的状态以及标记。
6)该buffer header被访问(touch)的次数。
7)正在等待该buffer header的进程列表(waiter list)和正在使用该buffer header的进程列表(user list)。

buffer cache中,缺省的hash bucket的数量或者说缺省有多少条hash chain链表,是由一个隐藏参数:
_db_block_hash_buckets决定的。置于该参数的取值,在我的测试中,8i下,该参数缺省为db_block_buffers×2;但是到了9i以后,该参数似乎取的是小于且最接近于db_block_buffers×2的素数。

关于如何深度分析oracle buffer cache的概念以及内存结构就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

数据 就是 算法 内存 结构 数值 参数 概念 方式 内容 实际 所在 指针 数组 文件 磁盘 索引 索引号 缓存 进程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 四川互联网软件开发报价 服务器js 山东房网网络技术有限公司 南关区网络技术口碑推荐 内蒙古氯雷应用软件开发 我的世界网易租免费服务器 天津互联网科技大厦科乐园 净网2018网络安全执法检查 数据库多表格关联 淮南物业管理软件开发定制 计算机网络安全的应用 网络安全研究生美国 四川c语言软件开发价位 人大金仓安全数据库 竹溪良好软件开发售后保障 上海融创互联网科技有限公司 安徽天成网络技术服务有限公司 潍坊加工管理软件开发 服务器机柜标准螺丝是几号的 关系型数据库怎么使用 服务器为什么要挂数据盘 机房服务器常见问题及处理方法 虎牙贱圣玩过的方舟服务器id 根据网络安全规定负责 网络安全技术与实践读书笔记 车牌录入数据库账号 班级网络安全自查表 山西it 软件开发哪家快 软件开发流程有哪些分类 php休眠两秒再查询数据库
0