楼主: vage

[精华] 揭密Oracle之七种武器之四:揭密Buffer Cache中的链表

[复制链接]
论坛徽章:
1
ITPUB社区OCM联盟徽章
日期:2013-11-21 16:35:25
51#
发表于 2012-8-20 15:58 | 只看该作者
您好:我想问一下,主、辅LRU链表中存的是什么?网上有人说是buffer header,但我理解buffer header是当数据块在被读入buffer cache时才会构造出来的啊~!!那flush buffer_cache后,buffer cache中的块都放在了辅LRU链表中,那这时辅LRU链表中只有块在内存中的地址吗?

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
52#
 楼主| 发表于 2012-8-20 16:10 | 只看该作者
liuxuelong007 发表于 2012-8-20 15:58
您好:我想问一下,主、辅LRU链表中存的是什么?网上有人说是buffer header,但我理解buffer header是当数据 ...

是buffer header。

那flush buffer_cache后,buffer cache中的块都放在了辅LRU链表中,那这时辅LRU链表中只有块在内存中的地址吗?

这一句没太理解

使用道具 举报

回复
论坛徽章:
1
ITPUB社区OCM联盟徽章
日期:2013-11-21 16:35:25
53#
发表于 2012-8-20 16:21 | 只看该作者
您好,我看网上有人是这说的:
在buffer cache中,每一个block读入 buffer cache时,都会在buffer cache中构造一个buffer header(buffer header与block一一对应)
1.存放该block在buffer cache中实际存储地址
2.存放该block的类型(data,segment header,undo header,undo block等类型)
3.由于此buffer header 所在的hash chain,是通过在buffer header保存指向前一个buffer header的指针和指向后一个buffer header的指针方式实现,所以还存指针
4.存储lru,lruw,ckptq,fileq等队列,一样是通过记录前后buffer header指针方式实现
5.当前该buffer header所对应的数据块的状态以及标记
6.该buffer header被访问的次数(touch次数)
7.正在等待该buffer header的进程列表(waiter list)及正在使用此buffer header的(user list)
那在block没有读入 buffer cache时,buffer header中存储的是什么呢?
就是flush buffer_cache后,buffer header中存储的是什么呢?

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
54#
 楼主| 发表于 2012-8-20 16:56 | 只看该作者
liuxuelong007 发表于 2012-8-20 16:21
您好,我看网上有人是这说的:
在buffer cache中,每一个block读入 buffer cache时,都会在buffer cache中 ...

那在block没有读入 buffer cache时,buffer header中存储的是什么呢?

可以认为是空的。
buffer Header中的内容,体现在x$bh中,可以通过这个视图,了解BH中的信息。也可以通过DUMP来了解。

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
55#
 楼主| 发表于 2012-8-20 17:01 | 只看该作者
taowang2016 发表于 2012-8-20 10:23
其实也不是这样,每个人看的角度和理解的深度不一样,同样一个wait event,V哥看到的,不一定大家都能看 ...

嗯,也是。
我后面也整理个文章,把一些遗漏的东西补一下。

关于检查点队列,可以查看晶晶小妹以前的文章,讲的很清楚、很详细。

使用道具 举报

回复
论坛徽章:
1
ITPUB社区OCM联盟徽章
日期:2013-11-21 16:35:25
56#
发表于 2012-8-20 17:03 | 只看该作者
那如果buffer Header为空的的时候,它在不在hash chain 上呢?

使用道具 举报

回复
论坛徽章:
4
ITPUB十周年纪念徽章
日期:2011-09-27 16:33:28ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222012新春纪念徽章
日期:2012-01-04 11:55:052013年新春福章
日期:2013-02-25 14:51:24
57#
发表于 2012-8-21 09:29 | 只看该作者
vage 发表于 2012-8-20 17:01
嗯,也是。
我后面也整理个文章,把一些遗漏的东西补一下。

谢谢V哥回复。

晶晶的检查点队列的,好象去年还看过,刚去看了一下,木有了。(http://space.itpub.net/?13095417

oracle internal的文章,如果在用code来追踪解释之前,辅以一些原理图(高级OWI.与Oracle这本书,里面很多这样的例子),我想大家理解和接受,会更直观。

字不如表,表不如图,呵呵,当然不能要求V哥写个好文章,还这么多要求了,这里仅提个建议。

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
58#
 楼主| 发表于 2012-8-21 10:13 | 只看该作者
liuxuelong007 发表于 2012-8-20 17:03
那如果buffer Header为空的的时候,它在不在hash chain 上呢?

这个我没验证过。
我想应该是不在的。
搜索Hash Chain是需要CBC Lattch保护的。如果很大空BH在链上,不是要影响搜索链的速度吗。为了减少持有CBC Latch的时间,Oracle应该不会将空BH放在链上的。

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
59#
发表于 2012-8-21 13:02 | 只看该作者
出书吧!太精彩了!

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
60#
发表于 2012-8-22 15:28 | 只看该作者
我在自己的环境中,想尝试着做一做您文章中内容。但是发现了一个奇怪的现象。请您帮忙看一看。

我把数据库从新启动之后,想要对test1表进行全表扫描。扫描前做了一次查询:

SQL>  select lru_flag,count(*) from x$bh a,dba_objects b where a.obj=b.data_object_id and object_name='TEST1' group by lru_flag;

no rows selected

这时还没有相关的block被读入buffer cache。

接着,执行一次全表扫描:

SQL> select count(*) from test1;

  COUNT(*)
----------
  33940480


Execution Plan
----------------------------------------------------------
Plan hash value: 3896847026

--------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Cost (%CPU)| Time     |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |     1 | 35646   (1)| 00:07:08 |
|   1 |  SORT AGGREGATE    |       |     1 |            |          |
|   2 |   TABLE ACCESS FULL| TEST1 |    29M| 35646   (1)| 00:07:08 |
--------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
         47  recursive calls
          0  db block gets
     187593  consistent gets
     130554  physical reads
          0  redo size
        529  bytes sent via SQL*Net to client
        519  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
          1  rows processed
第一次执行,产生物理读是很正常的。

可以当我连续执行了三次这个sql文之后,结果发现仍然有大量的物理读。这太不正常了吧???
SQL> /

  COUNT(*)
----------
  33940480


Execution Plan
----------------------------------------------------------
Plan hash value: 3896847026

--------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Cost (%CPU)| Time     |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |     1 | 35646   (1)| 00:07:08 |
|   1 |  SORT AGGREGATE    |       |     1 |            |          |
|   2 |   TABLE ACCESS FULL| TEST1 |    29M| 35646   (1)| 00:07:08 |
--------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
     187488  consistent gets
     130419  physical reads
          0  redo size
        529  bytes sent via SQL*Net to client
        519  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>


查看lru的使用情况以后,觉得也挺奇怪的。
SQL> select lru_flag,count(*) from x$bh a,dba_objects b where a.obj=b.data_object_id and object_name='TEST1' group by lru_flag;

  LRU_FLAG   COUNT(*)
---------- ----------
         2         56
         0         79

如此大的表,只是占用了少量的主lru的冷端而已。这是为什么呢??

我的数据库是11.2.0.2.

SQL> show sga

Total System Global Area 4275781632 bytes
Fixed Size                  2233336 bytes
Variable Size            2768243720 bytes
Database Buffers         1493172224 bytes
Redo Buffers               12132352 bytes

SQL> select segment_name,bytes from dba_segments where segment_name='TEST1';

SEGMENT_NAME
--------------------------------------------------------------------------------
     BYTES
----------
TEST1
1072693248

使用道具 举报

回复

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

本版积分规则 发表回复

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