千家信息网

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

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章给大家介绍如何深度分析oracle buffer cache的概念以及内存结构,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.buffer cache的概念用最简单的语
千家信息网最后更新 2025年02月01日如何深度分析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安全错误 数据库的锁怎样保障安全 网络技术部的个人认知 河南乐游网络技术有限公司 数据库安全性保护的主要内容 社会工程学在网络安全领域的应用 江苏苏州公安局网络安全支队长 达梦数据库查询字符串长度 网络安全行征文 宝塔如何导入数据库404 哪家券商服务器好 接口软件开发协议 江西学校卫星授时服务器虚拟主机 1和N数据库设计 交警网络安全管理是文职吗 打黄扫非网络安全课视频 漯河市网络安全倡议书范文 贵阳市非物质文化遗产数据库 神通数据库连接不上数据库 政府单位网络安全事例 hpo数据库中医证候 软件开发涉及哪些内容 数据库著录格式 北碚区技术软件开发服务公司 西门子数据库啥意思 数据库实践遇到的问题 双人成行怎么连接服务器 qq群中国网络安全局 网络安全与系统安全 黄浦区常用网络技术创新服务 服务器默认管理口ip 长沙望城软件开发公司有哪些
0