查看: 7505|回复: 21

[讨论] buffer cache两三问

[复制链接]
求职 : 数据库管理员
论坛徽章:
1
2010广州亚运会纪念徽章:羽毛球
日期:2010-11-29 10:28:31
跳转到指定楼层
1#
发表于 2010-9-15 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.alter table test cache;使对test全表扫描的数据全部cache到默认池的MRU端。那这些数据会慢慢移动到LRU端,进而移出内存么?
  
2.之后对此表的所有DML操作,oracle会自动把变化cache到默认池中吗?还是再次执行全表扫描时才会cache到默认池中?

3.如果会被移出内存,那么使用alter table test storge(buffer_pool keep) cache;是不是可以避免这个问题?

4.oracle在查询默认池中是否有需要的数据时,是从MRU端开始搜索吗?

5.如果是从MRU端搜索,那么上述情况是不是最好cache到保持池,以减少oracle对默认池中不必要数据的搜索

6.不想再把test表cache到内存中,应如何操作?
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
2#
发表于 2010-9-15 14:21 | 只看该作者
1.会
2.cache和使用什么池没关系;所有的变化都先发生在内存中,然后flush到磁盘上
3.buffer_pool keep 使用keep 池,如果这个池足够大,就可以保证不会被移出keep pool~ cache参数没有这个作用
4.看看db cache的结构,MRU是用来选择age out内存的数据用的,不是用来搜索数据用的
5. .... 没发回答你.
6. alert table test nocache. 取消cache参数。

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
1
2010广州亚运会纪念徽章:羽毛球
日期:2010-11-29 10:28:31
3#
 楼主| 发表于 2010-9-15 15:11 | 只看该作者
4. oracle 10 concept 上说:当Oracle 的用户进程(user process)首次查询某块数据时,将首先在数据缓存区内进行搜索。
  那oracle是如何搜索呢,不是搜索LRU list么?如果会搜索LRU list,那么oracle又是怎样搜索的呢?

[ 本帖最后由 elysium_H 于 2010-9-15 15:50 编辑 ]

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
1
2010广州亚运会纪念徽章:羽毛球
日期:2010-11-29 10:28:31
4#
 楼主| 发表于 2010-9-15 15:49 | 只看该作者
2.是不是可以这样理解,执行alter table test cache后,通过全表扫描把test的全表数据cache到内存中,之后所有的DML操作引起的数据变化,在提交后都会在内存中保留结果,即缓存中test表数据,是DB文件中test表数据的全镜像

使用道具 举报

回复
论坛徽章:
25
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010世博会纪念徽章
日期:2010-07-30 12:07:232011新春纪念徽章
日期:2011-02-18 11:43:332010广州亚运会纪念徽章:高尔夫球
日期:2011-04-11 18:22:37蜘蛛蛋
日期:2011-08-17 08:44:40ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15复活蛋
日期:2011-12-15 09:06:552012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24
5#
发表于 2010-9-15 18:08 | 只看该作者

回复 #3 elysium_H 的帖子

首先看数据块的地址是否符合,不符合跳过,接下来,地址符合后,看是否为CR块,如果是CR块,跳过,再则,看是否为READING中,如果是,等待,如果不是,再看data buffer上用户列表中是否正在使用,如果是,则看锁定模式是否和当前兼容,兼容则把DATA BUFFER中的数据块地址返回给进程并把当前进程号放到用户列表中,如果不兼容,用刚才那个块复制一个CR块,并把当前进程号放到用户列表中。如果找不到符合的地址,到存储或磁盘上去读到内存

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
6#
发表于 2010-9-16 08:11 | 只看该作者
原帖由 elysium_H 于 2010-9-15 15:49 发表
2.是不是可以这样理解,执行alter table test cache后,通过全表扫描把test的全表数据cache到内存中,之后所有的DML操作引起的数据变化,在提交后都会在内存中保留结果,即缓存中test表数据,是DB文件中test表数据的全镜像


Oracle的机制在正常情况下(通过SGA)是不会直接对文件进行修改的,所有的变更都在buffer cache中,由dbwr及checkpoint来负责将buffer cache中的内容写入文件,如果buffer cache 中不存在这个表(没有被读入或者被换出)那么需要先将文件中的内容读入buffer cache然后才能继续操作

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
7#
发表于 2010-9-16 08:13 | 只看该作者
原帖由 elysium_H 于 2010-9-15 11:24 发表
3.如果会被移出内存,那么使用alter table test storge(buffer_pool keep) cache;是不是可以避免这个问题?


可以,前提是keep buffer池足够大

使用道具 举报

回复
论坛徽章:
25
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010世博会纪念徽章
日期:2010-07-30 12:07:232011新春纪念徽章
日期:2011-02-18 11:43:332010广州亚运会纪念徽章:高尔夫球
日期:2011-04-11 18:22:37蜘蛛蛋
日期:2011-08-17 08:44:40ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15复活蛋
日期:2011-12-15 09:06:552012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24
8#
发表于 2010-9-16 17:57 | 只看该作者
再大都有可能移出

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
9#
发表于 2010-9-16 19:33 | 只看该作者
原帖由 microsoft_fly 于 2010-9-16 17:57 发表
再大都有可能移出


为啥?

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
10#
发表于 2010-9-17 03:26 | 只看该作者
Keep pool is really just a separate pool. I don't think there's anything magic. I hope somebody can test. Just allocate a few big tables to a small keep pool so the pool is definitely smaller than the total size of these few tables. Full scan one table. Find their blocks in the pool. Scan another. See if the first table's blocks have disappeared from the keep pool. I think they will.

Yong Huang

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表