Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

351

积分

0

好友

8

主题
1#
发表于 2012-5-7 09:44:04 | 查看: 5333| 回复: 2
官方文档上说数据字典信息是缓存在share pool的row cache里面的,但是我发现并不是这样的:

select count(1) from v$bh where objd = (select object_id from dba_objects where object_name = 'OBJ$');

COUNT(1)
-------
958

可见,buffer cache里面也有缓存数据字典,为什么oracle需要在row cache和buffer cache同时缓存数据字典呢?
2#
发表于 2012-5-7 12:31:21
dictionary  cache ==> 也叫做row cache , row cache字典缓存 是oracle 中 真正意义上 以 行 row 形式呈现的数据结构。

buffer cache 中当然会有 数据字典基表 ,但是  buffer cache中的信息 总是以 block的形式存放的, 而字典缓存的 存在是为了 方便 oracle 内部函数操作、和解析操作能够 高效的运行的, 如果直接访问block中的字典信息 那么显然是很低效的。 另一方面 对字典的并发访问和修改  不能直接依赖于 block lock , 只有  row cache的形式才能实现。


但是 需要注意 本质上row cache的数据来源于 buffer cache中的 字典基表 例如tab$ 、 obj$等, 同时字典信息也最终 会以buffer cache的形式被保存到磁盘上。

可以参考下图

row_cache_from_buffer_cache.png

回复 只看该作者 道具 举报

3#
发表于 2012-5-7 16:46:38
转一段白鳝的说明
ROW CACHE绝对不是纯粹的数据字典表的缓冲。数据字典表和普通的表没有不同,其数据块的缓冲是相同的。而ROW CACHE是经过组织的,用于数据库运行中SQL解析、权限控制等用途的内部数据结构,是一种字典表的内存视图。如果Oracle 在执行某个SQL的时候,为了SQL解析,需要访问一些字典表,从中获取一些数据,那么Oracle 会调用一些递归调用SQL来完成这些事情,这些SQL和普通SQL一样,需要将数据块从SYSTEM表空间中读取到DB CACHE中,然后从DB CACHE中获得SQL所需要的行数据,为了减少递归SQL的执行开销,这些行数据就在共享池中被缓存了,写个缓存就是ROW CACHE。

问题似乎明朗化了,ROW CACHE其实是一个Oracle 内部使用的数据结构而已,由于数据字典的数据十分庞大,oracle无法将所有的所需的字典信息全部载入内存,因此对ROW CACHE的管理也采用了LRU的算法。ROW CACHE中保留了当期活跃的数据,一些不常用的数据将会被AGEOUT出去。
http://www.oraclefans.cn/forum/showblog.jsp?rootid=38638

回复 只看该作者 道具 举报

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

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-15 13:53 , Processed in 0.055146 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569