楼主: 晶晶小妹

[原创] 晶晶实验十八之buffer cache中的LRU链

[复制链接]
论坛徽章:
63
19周年集字徽章-19
日期:2020-09-23 02:43:002012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
11#
发表于 2008-3-12 01:03 | 只看该作者
刚好今天处理了一个这样的CASE.

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
25
生肖徽章2007版:龙
日期:2008-05-06 11:07:48咸鸭蛋
日期:2011-10-19 10:09:12ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24
12#
发表于 2008-3-12 09:21 | 只看该作者
select /*+index(qsmed.zjj1) */ * from qsmed.zjj1 where id>=1750 and id<=3500;

晶晶,你确认这玩意走索引么。或者说,你加提示的意义何在。
我怀疑它被忽略了。

[ 本帖最后由 foxmile 于 2008-3-12 09:25 编辑 ]

使用道具 举报

回复
论坛徽章:
2
2008新春纪念徽章
日期:2008-02-13 12:43:032010新春纪念徽章
日期:2010-03-01 11:08:24
13#
发表于 2008-3-12 09:49 | 只看该作者
借小妹的宝地提几个问题,大伙讨论一下:
buffer cache中有两个很中要的链表,即写链表(包含 脏数据块)和LRU链表,当一个用户进程要访问缓存块时,首先是要搜索LRU链表,假如要访问的缓存块不在LRU链表中的话,那么首先要做的工作就是去在LRU链表中找空闲缓冲块或者是可覆盖的缓冲块(可覆盖的缓冲块产生是由于DBWR进程对缓冲块进行写盘,然后将该已经写盘的缓冲块移到LRU链表的LRU端)。
两个问题:
1、当我们要读入内存中的缓冲块是多个缓冲块,假如是10个db_block_size的大小,那么在LRU链表中找的时候,是否是要在LRU的空闲缓冲块中找连续的链表节点来存放要从硬盘读入内存的多个缓冲块?
2、数据库刚启动时所有的buffer cache的内存块应该都是在LRU链表中吧?
3、单个数据块在buffer cache中的LRU位置是否是根据某种算法确定的固定的位置?如果是随机的,那么oracle通过什么办法快速的在buffer cache中找到需要的数据块?

使用道具 举报

回复
论坛徽章:
41
秀才
日期:2015-07-30 11:13:40秀才
日期:2015-09-06 10:42:32秀才
日期:2015-09-10 09:29:01处女座
日期:2016-05-27 11:00:18
14#
发表于 2008-3-12 10:00 | 只看该作者
破阵子--晶晶

醉里挑灯发帖/
梦回键盘霹雳/
八百里思路驰骋/
二十年意志如铁/
信仰在心间

苦心撰写实验/
一片冰心可鉴/
了却大家困惑心/
赢得论坛无私名/
回眸百媚生!

使用道具 举报

回复
论坛徽章:
38
2010新春纪念徽章
日期:2010-01-04 08:33:082012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主2段
日期:2012-05-15 15:24:11优秀写手
日期:2013-12-18 09:29:08马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
15#
 楼主| 发表于 2008-3-12 10:16 | 只看该作者
原帖由 foxmile 于 2008-3-12 09:21 发表
select /*+index(qsmed.zjj1) */ * from qsmed.zjj1 where id>=1750 and id



步3:进一步加大从ZJJ_1扫描的行数:
SQL> select /*+index(qsmed.zjj1) */ * from qsmed.zjj1 where id<=7000;
已选择7000行。

执行计划
----------------------------------------------------------
Plan hash value: 2538640105
---------------------------------------------------------------------------------------
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         |  7060 |   654K|   116   (1)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| ZJJ1    |  7060 |   654K|   116   (1)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | ZJJ1_ID |  7060 |       |    18   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

我把执行计划给贴上了吖,蚊子.

使用道具 举报

回复
论坛徽章:
27
会员2007贡献徽章
日期:2007-09-26 18:42:102011新春纪念徽章
日期:2011-02-18 11:43:342010广州亚运会纪念徽章:排球
日期:2011-03-03 12:19:332010广州亚运会纪念徽章:篮球
日期:2011-03-10 14:25:06ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15灰彻蛋
日期:2011-12-28 16:56:322012新春纪念徽章
日期:2012-01-04 11:50:44迷宫蛋
日期:2012-03-09 15:14:20蜘蛛蛋
日期:2012-03-26 09:46:32
16#
发表于 2008-3-12 10:19 | 只看该作者
SQL> select lru_flag,tch from x$bh where dbablk=12 and dbarfil=7;
  LRU_FLAG        TCH                                                           
---------- ----------                                                           
         0         10                                                           
ZJJ1的25个物理读,目前还没有对12号文件7号块的状态有任何的影响,只不过,12号文件7号块被挤了向冷端末尾:

这个是怎么看出来的??? 挤了向冷端末尾  lru_flag不是还等于0吗??

使用道具 举报

回复
论坛徽章:
38
2010新春纪念徽章
日期:2010-01-04 08:33:082012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主2段
日期:2012-05-15 15:24:11优秀写手
日期:2013-12-18 09:29:08马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
17#
 楼主| 发表于 2008-3-12 10:22 | 只看该作者
原帖由 fly_bug 于 2008-3-12 09:49 发表
借小妹的宝地提几个问题,大伙讨论一下:
buffer cache中有两个很中要的链表,即写链表(包含 脏数据块)和LRU链表,当一个用户进程要访问缓存块时,首先是要搜索LRU链表,假如要访问的缓存块不在LRU链表中的话,那么首先要做的工作就是去在LRU链表中找空闲缓冲块或者是可覆盖的缓冲块(可覆盖的缓冲块产生是由于DBWR进程对缓冲块进行写盘,然后将该已经写盘的缓冲块移到LRU链表的LRU端)。
两个问题:
1、当我们要读入内存中的缓冲块是多个缓冲块,假如是10个db_block_size的大小,那么在LRU链表中找的时候,是否是要在LRU的空闲缓冲块中找连续的链表节点来存放要从硬盘读入内存的多个缓冲块?
2、数据库刚启动时所有的buffer cache的内存块应该都是在LRU链表中吧?
3、单个数据块在buffer cache中的LRU位置是否是根据某种算法确定的固定的位置?如果是随机的,那么oracle通过什么办法快速的在buffer cache中找到需要的数据块?



1,这个不必须连续,如果没有连续的块,就一直寻找,直到找够所用块为止.
2,据说是这样,不过我没有证明.
3,位置是不固定,块会来回的挪动,oracle通过HASH算法快速找到需要的数据块.

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2008-03-13 10:32:44生肖徽章2007版:鸡
日期:2008-04-03 18:55:51数据库板块每日发贴之星
日期:2008-04-21 01:01:58奥运会纪念徽章:拳击
日期:2008-06-14 10:29:372014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
18#
发表于 2008-3-12 10:26 | 只看该作者
哈哈,好厉害,正想问问晶晶小妹是怎么想出这么多专题来做实验的:)

使用道具 举报

回复
论坛徽章:
38
2010新春纪念徽章
日期:2010-01-04 08:33:082012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主2段
日期:2012-05-15 15:24:11优秀写手
日期:2013-12-18 09:29:08马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
19#
 楼主| 发表于 2008-3-12 10:30 | 只看该作者
原帖由 carcase 于 2008-3-12 10:19 发表
SQL> select lru_flag,tch from x$bh where dbablk=12 and dbarfil=7;
  LRU_FLAG        TCH                                                           
---------- ----------                                                           
         0         10                                                           
ZJJ1的25个物理读,目前还没有对12号文件7号块的状态有任何的影响,只不过,12号文件7号块被挤了向冷端末尾:

这个是怎么看出来的??? 挤了向冷端末尾  lru_flag不是还等于0吗??


每个新插入的块都会进入冷端头,所以有新块进入后,此块不就被挤向冷端尾了嘛.
lru_flag等于0的时候无意义.

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
25
生肖徽章2007版:龙
日期:2008-05-06 11:07:48咸鸭蛋
日期:2011-10-19 10:09:12ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24
20#
发表于 2008-3-12 10:34 | 只看该作者
原帖由 晶晶小妹 于 2008-3-12 10:16 发表



步3:进一步加大从ZJJ_1扫描的行数:
SQL> select /*+index(qsmed.zjj1) */ * from qsmed.zjj1 where id

这个的意思是所有的索引都启用?我的意思是你引用了id做条件的时候,其实优化器会选择走索引的,怀疑这个不加索引名的情况下提示是不是有用。

[ 本帖最后由 foxmile 于 2008-3-12 10:37 编辑 ]

使用道具 举报

回复

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

本版积分规则 发表回复

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