《DBA的思想天空:感悟Oracle数据库本质》第二章 要点摘录[原创]_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2146 | 回复: 0   主题: 《DBA的思想天空:感悟Oracle数据库本质》第二章 要点摘录[原创]        下一篇 
lei.wang
注册用户
等级:上尉
经验:767
发帖:21
精华:0
注册:1970-1-1
状态:离线
发送短消息息给lei.wang 加好友    发送短消息息给lei.wang 发消息
发表于: IP:您无权察看 2015-3-13 16:36:02 | [全部帖] [楼主帖] 楼主

《DBA的思想天空:感悟Oracle数据库本质》第二章 理解 DB Cache
  • DB Cache 的存在主要是为了提高会话访问数据文件中数据的效率
  • DB Cache是以 Block为单位组织的缓冲区,不同的 Block Size的数据块对应于不同的 DB Cache
  • 前台进程只负责将数据块从文件中读取到DB CACHE中,而DB CACHE中的脏数据是由DBWn进程来负责写入数据文件
  • 一般情况下,DB cache命中率越高,访问性能越好;
  • 数据库刚刚启动时,DB CACHE中几乎没有用户数据的缓冲(除非在系统级触发器中做了事先加载);
  • 当会话访问数据库的表和索引时,首先会检查 DB Cache中是否存在该数据;如果不存在,就会从数据文件中读取该数据块到 DB Cache,然后再从 DB Cache中读取该数据。
  • 定位 DB Cache中的数据块是通过散列算法实现的,对于 DB Cache来说,Oralce为了提高数据块定位的速度,为其设计了一个 Hash链结构,将整个 DB Cache中正在使用的数据块都放置到Hash链上,这个 Hash链是由多个 Bucket组成的多链结构,每个 Bucket就是一条链的链头,从链头引出一条独立的双向链
  • Oracle 设计 Hash链的基本思路是,每个链上有最少的 Buffer数量,最佳的情况是每条链上只有一个 Buffer
  • 普通会话只读取和修改 DB Cache,不负责将脏数据写入磁盘
  • 访问 Hash链时,为了保证数据访问的一致性,通过 cache buffers chains闩锁来保护 Hash链的数据结构
  • 一般来说会话分配 Cache 时,会从 LRU 的冷端开始查找。在冷端找到脏块就把脏块移到 LRU-W(DBWR的任务就是将 LRU-W中的脏数据写入文件,然后将这些缓冲区从 LRU-W上释放,变为可用缓冲),找到没有被 PIN住的非脏块,就完成了缓冲区的分配操作
  •  LRU链通过 cache buffers lru chains来保护,因此针对 LRU链的操作都要使用该闩锁。如果该闩锁发生较为严重的争用,说明数据块缓冲的分配操作出现了性能瓶颈,大多数情况下,DB Cache容量不足都可能导致该闩锁严重争用
  • 将经常访问的数据放入 Keep Pool,一次性使用的数据可以使用 Recycle Pool
  • 在 RAC环境下,更需要减少热块冲突,减少不必要的节点间 DB Cache的传输。在 RAC环境中,要提高全局缓冲的性能,除了在硬件上提高私有网络的带宽外,尽可能提高 DB Cache 的命中率也十分关键
  • DB Cache是由一系列共享内存组成的,是在 SGA中统一分配的一个组件
  • SGA是以 GRANULE为单位的,大多数系统的 GRANULE的大小一般为 16M,SGA比较小的系统可能为 4M。每个GRANULE中包含多个 Buffer,这些 Buffer的大小和数据块的大小相同。
  • DB Cache 中有多种类型的链,这些链大多数是双向链表,这些链表可以归结为两类,LRU链和 HASH链。LRU链根据 LRU算法对 DB Cache进行 Buffer分配和换出(Age Out)的管理而 HASH链能够加快对 DB Cache的访问(一个是为了分配和换出,另一个则是为了逻辑读)
  • 全表扫描会对DB Cache造成较大的影响,因为有大量的数据块需要被扫描, 并放入DB Cache中。为了尽可能少地影响 DB Cache,对于大表的全表扫描,Oracle 数据库设计了一个算法,使这类扫描操作增加的 Buffer被放在 LRU链的尾部,而不是中部,因此这些 Buffer会被最快换出,尽可能不影响 LRU 链中的热块,不会将较常用的数据很快挤到尾部。
  • 在一个并发量很大的系统中,这种寻址的效率决定了系统的性能。当我们要访问某个数据块的时候,能够依赖的参数就是文件号和块号。
  • 一个数据块的文件号和块号通过散列算法,会定位到唯一的一个 Bucket上,因此该数据块在 DB Cache中的 Bucket的位置是固定的。通过这种机制,Oracle就可以在 DB Cache中快速定位到这个数据块了
  • 散列算法使用的参数是文件号和块号,因此一个数据块的不同版本,在 DB Cache的 HASH链中肯定在同一条链上,因为它们具有相同的文件号和块号


该贴被lei.wang编辑于2015-3-13 16:37:27

该贴被lei.wang编辑于2015-3-13 16:38:13



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论