hctech 发表于 2012-5-9 09:02:33

关于cache buffer chain 、hash bucket、hash chain的讨论

关于刘大一篇文章中“得到buffer handle的过程中首先要抢占cache buffer handles栓”    找到buffer了不是直接pin住吗,怎么还有一个栓哦。。其它地方都没看到过关于这个过程的资料,刘大能不能详细说说~








==================================================================================

comment by  maclean


这个帖子由于 原帖没有表达清楚,现改为对 cache buffer chain 、hash bucket、hash chain的讨论

Maclean Liu(刘相兵 发表于 2012-5-9 15:51:44

你说的 是 cache buffer chain 的相关latch , 首先需要搞明白为什么要有 cache buffer chain(hash chain) 和 cache buffer bucket (hash bucket)

对于Buffer cache管理而言 oracle所需要 解决的问题包括 几个:

1.  如何 快速定位一个data buffer header,因为 Buffer cache中的 data buffer header 是非常多的 , 若为了找一个data buffer header 而去 对所有的 buffer header都 扫描一遍 ,那将是非常低效的。


举个例子来说 服务进程要 有读取 datafile 5 block 10的需求 , 这个时候 难道服务进程 一开始就知道 data file 5 的 block 10在   是不是在 Buffer cache中,  在Buffer cache中的哪里? 这些信息 Server process都是不知道的。

如果 data buffer header被 使用 普通的双向链表组织,那么 如果要确定一个 data buffer是否在 Buffer Cache中,那么需要把 这个双向链表上所有的buffer header都查看一遍, 这是十分低效的。

2.  对 data buffer header 高效的并发管理 ,避免出现 争用。



为了 实现 高效管理 data buffer header的目的 , oracle 使用 hash buckets的结构来 组织 data buffer header, 通过对 data buffer header 的 不同 rdba 和 class 做HASH 算法 来实现 对 buffer header的高效管理,  通俗来说 HASH做的就是一件事  ,  例如 data file 4 上的 block 18 和 block 19是 应用经常要访问的热快, 经过HASH算法之后 这2个块 就不会落在同一个HASH Buckets中,这样避免了对 同一条hash chain的争用。   


oracle又通过  hash chains( cache buffer chain) 将一个bucket 上的buffer header串起来 ,  注意 同一个data block在oracle中可能会有 多个buffer , 分别对应为一个 current block 和可能的多个 cr block, 这些block都同一条 cache buffer chains上。


为了实现 对cache buffer chains的并发控制 需要用到 latch来管理 , 所以会有 cache buffer chains latch。


CBC 的latch管理是 Buffer cache Internal的主要部分,值得研究 但是并非 一段文字所能全部描述。

你也可以参考下面 这个图示:

aquarius 发表于 2012-5-9 16:00:33

例如 data file 4 上的 block 18 和 block 19是 应用经常要访问的热快, 经过HASH算法之后 这2个块 就不会落在同一个HASH Buckets中,这样避免了对 同一条hash chain的争用。   
这个说法不是很对吧    一个hash bucket管理一段区域内的hash value,只要落在这个hash value范围内的buffer,都会挂在该hash chain上,由同一个cache buffer chain latch管理

szkking 发表于 2012-5-9 16:00:40

为什么很多时候,cache buffer chain是BUG

有些时候这个等待是由于SQL的执行计划改变而导致的热块争用,
但有些时候这个是BUG,我一般去做的是对比执行计划,或者抓TOP SQL查看执行计划,
但如果是BUG,一般需要怎么确认?

Maclean Liu(刘相兵 发表于 2012-5-9 16:59:08

回复 3# 的帖子

我们修改 隐藏参数 _db_block_hash_buckets , 将hash buckets 的数量减少到 最少(256);
这会导致大量的 BH 将不得不存放在少数的hash buckets中, 再观察相邻块的 表现;SQL> alter system set "_db_block_hash_buckets"=256 scope=spfile;

System altered.

SQL> startup force;
ORACLE instance started.

Total System Global Area  939495424 bytes
Fixed Size                  2233960 bytes
Variable Size             708839832 bytes
Database Buffers          222298112 bytes
Redo Buffers                6123520 bytes
Database mounted.
Database opened.


SQL> show parameter hash

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_db_block_hash_buckets               integer     256
hash_area_size                       integer     131072


SQL>
SQL>
SQL> create table test_buffer_bucket tablespace users pctfree 99 as select * from dba_objects ;

Table created.


SQL>  select object_id,data_object_id from dba_objects where object_name='TEST_BUFFER_BUCKET';

OBJECT_ID DATA_OBJECT_ID
---------- --------------
     81261          81261         
         

SQL> select count(*) from test_buffer_bucket;

  COUNT(*)
----------
     75315

SQL>  select count(*) from test_buffer_bucket;

  COUNT(*)
----------
     75315
         
SQL>  select file#,block#,class# from v$bh where OBJD=81261 order by block#
  2  ;


     FILE#     BLOCK#     CLASS#
---------- ---------- ----------
         4     162816          8
         4     162817          8
         4     162944          8
         4     162945          8
         4     163072          8
         4     163073          8
         4     163200          8
         4     163201          8
         4     163328          8
         4     163329          8
         4     163456          8
.............


     FILE#     BLOCK#     CLASS#
---------- ---------- ----------
         4     237489          1
         4     237568          8
         4     237569          8
         4     237570          8
         4     237571          8
         4     238254          1
         4     238592          8
         4     238593          8
         4     238594          8
         4     238595          8

593 rows selected.


SQL> select count(*) ,HLADDR from x$bh group by HLADDR;

  COUNT(*) HLADDR
---------- ----------------
        58 00000000973997B8
        44 0000000097399890
        52 0000000097399968
        47 0000000097399BF0
        52 0000000097399CC8
        47 0000000097399E78
        45 000000009739A028
        46 000000009739A100
        45 000000009739A460
        49 000000009739A538
        44 000000009739A610

  COUNT(*) HLADDR
---------- ----------------
        42 000000009739A7C0
        53 000000009739A898
        33 000000009739A970
        49 000000009739AA48
        53 000000009739ADA8
        51 000000009739AE80
        54 000000009739B1E0
        41 000000009739B2B8
        50 000000009739B468
        44 000000009739B6F0
        42 000000009739B8A0

  COUNT(*) HLADDR
---------- ----------------
        46 000000009739BA50
        39 000000009739BCD8
        51 000000009739C038
        49 000000009739C110
        46 000000009739C2C0
        53 000000009739C620
        43 000000009739C6F8
        44 000000009739CE90
        41 000000009739CF68
        46 000000009739D118
        47 000000009739D2C8

  COUNT(*) HLADDR
---------- ----------------
        46 000000009739D3A0
        51 000000009739D550
        37 000000009739D7D8
        46 000000009739D8B0
        36 000000009739DA60
        44 000000009739DB38
        36 000000009739DC10
        41 000000009739DCE8
        51 000000009739DDC0
        52 000000009739E048
        45 000000009739E2D0

  COUNT(*) HLADDR
---------- ----------------
        57 000000009739E480
        45 000000009739E558
        44 000000009739E630
        41 000000009739E708
        50 000000009739E990
        43 000000009739EC18
        44 000000009739ECF0
        56 000000009739EEA0
        39 000000009739EF78
        52 000000009739F200
        40 000000009739F2D8

  COUNT(*) HLADDR
---------- ----------------
        35 000000009739F560
        50 000000009739F638
        55 000000009739F7E8
        47 000000009739F8C0
        39 000000009739F998
        32 000000009739FC20
        58 000000009739FCF8
        45 000000009739FEA8
        43 00000000973A0130
        53 00000000973A0490
        48 00000000973A0568

  COUNT(*) HLADDR
---------- ----------------
        40 00000000973A0640
        53 00000000973A0718
        41 00000000973A07F0
        40 00000000973A08C8
        43 00000000973A0A78
        49 00000000973A0B50
        45 00000000973A0DD8
        54 00000000973A0EB0
        42 00000000973A1060
        43 00000000973A1138
        50 00000000973A1210

  COUNT(*) HLADDR
---------- ----------------
        54 00000000973A12E8
        45 00000000973A13C0
        44 00000000973A1498
        49 00000000973A1648
        52 00000000973A1720
        45 00000000973A17F8
        52 00000000973A18D0
        35 00000000973A19A8
        38 00000000973A1C30
        52 00000000973A1EB8
        39 00000000973A2068

  COUNT(*) HLADDR
---------- ----------------
        48 00000000973A23C8
        51 00000000973A24A0
        48 00000000973A2578
        42 00000000973A2728
        42 00000000973A2800
        41 00000000973A28D8
        41 00000000973A2A88
        52 00000000973A2B60
        42 00000000973A2C38
        41 00000000973A2EC0
        48 00000000973A2F98

  COUNT(*) HLADDR
---------- ----------------
        52 00000000973A32F8
        38 00000000973A34A8
        48 00000000973A3580
        42 00000000973A38E0
        49 00000000973A3B68
        52 00000000973A3D18
        40 00000000973A3DF0
        40 00000000973A3FA0
        52 00000000973A4300
        44 00000000973A43D8
        44 00000000973A44B0

  COUNT(*) HLADDR
---------- ----------------
        51 00000000973A49C0
        51 00000000973A4A98
        49 00000000973A4B70
        30 00000000973A4C48
        44 00000000973A4D20
        50 00000000973A4DF8
        56 00000000973A4FA8
        49 00000000973A5230
        45 00000000973A5308
        43 00000000973A53E0
        39 00000000973A5590

  COUNT(*) HLADDR
---------- ----------------
        54 00000000973A5668
        47 00000000973A5740
        39 00000000973A58F0
        51 00000000973A59C8
        35 00000000973A5D28
        41 00000000973A6238
        46 00000000973A6310
        41 00000000973A64C0
        48 00000000973A6820
        38 00000000973A68F8
        47 00000000973A6AA8

  COUNT(*) HLADDR
---------- ----------------
        59 00000000973A6D30
        42 0000000097399A40
        42 0000000097399B18
        51 0000000097399DA0
        46 0000000097399F50
        54 000000009739A1D8
        42 000000009739A2B0
        38 000000009739A388
        47 000000009739A6E8
        53 000000009739AB20
        51 000000009739ABF8

  COUNT(*) HLADDR
---------- ----------------
        42 000000009739ACD0
        51 000000009739AF58
        50 000000009739B030
        39 000000009739B108
        41 000000009739B390
        42 000000009739B540
        46 000000009739B618
        53 000000009739B7C8
        55 000000009739B978
        45 000000009739BB28
        45 000000009739BC00

  COUNT(*) HLADDR
---------- ----------------
        43 000000009739BDB0
        46 000000009739BE88
        49 000000009739BF60
        44 000000009739C1E8
        53 000000009739C398
        39 000000009739C470
        50 000000009739C548
        49 000000009739C7D0
        40 000000009739C8A8
        51 000000009739C980
        61 000000009739CA58

  COUNT(*) HLADDR
---------- ----------------
        55 000000009739CB30
        39 000000009739CC08
        52 000000009739CCE0
        32 000000009739CDB8
        43 000000009739D040
        47 000000009739D1F0
        53 000000009739D478
        40 000000009739D628
        44 000000009739D700
        44 000000009739D988
        60 000000009739DE98

  COUNT(*) HLADDR
---------- ----------------
        37 000000009739DF70
        35 000000009739E120
        42 000000009739E1F8
        41 000000009739E3A8
        56 000000009739E7E0
        42 000000009739E8B8
        57 000000009739EA68
        36 000000009739EB40
        38 000000009739EDC8
        46 000000009739F050
        42 000000009739F128

  COUNT(*) HLADDR
---------- ----------------
        56 000000009739F3B0
        42 000000009739F488
        42 000000009739F710
        45 000000009739FA70
        50 000000009739FB48
        58 000000009739FDD0
        47 000000009739FF80
        53 00000000973A0058
        44 00000000973A0208
        49 00000000973A02E0
        44 00000000973A03B8

  COUNT(*) HLADDR
---------- ----------------
        46 00000000973A09A0
        46 00000000973A0C28
        56 00000000973A0D00
        36 00000000973A0F88
        43 00000000973A1570
        53 00000000973A1A80
        45 00000000973A1B58
        58 00000000973A1D08
        43 00000000973A1DE0
        45 00000000973A1F90
        40 00000000973A2140

  COUNT(*) HLADDR
---------- ----------------
        54 00000000973A2218
        39 00000000973A22F0
        54 00000000973A2650
        50 00000000973A29B0
        46 00000000973A2D10
        46 00000000973A2DE8
        56 00000000973A3070
        50 00000000973A3148
        41 00000000973A3220
        43 00000000973A33D0
        40 00000000973A3658

  COUNT(*) HLADDR
---------- ----------------
        45 00000000973A3730
        49 00000000973A3808
        51 00000000973A39B8
        49 00000000973A3A90
        41 00000000973A3C40
        56 00000000973A3EC8
        43 00000000973A4078
        46 00000000973A4150
        40 00000000973A4228
        47 00000000973A4588
        57 00000000973A4660

  COUNT(*) HLADDR
---------- ----------------
        39 00000000973A4738
        39 00000000973A4810
        50 00000000973A48E8
        43 00000000973A4ED0
        61 00000000973A5080
        36 00000000973A5158
        50 00000000973A54B8
        49 00000000973A5818
        35 00000000973A5AA0
        39 00000000973A5B78
        45 00000000973A5C50

  COUNT(*) HLADDR
---------- ----------------
        48 00000000973A5E00
        44 00000000973A5ED8
        42 00000000973A5FB0
        42 00000000973A6088
        53 00000000973A6160
        54 00000000973A63E8
        47 00000000973A6598
        51 00000000973A6670
        36 00000000973A6748
        51 00000000973A69D0
        53 00000000973A6B80

  COUNT(*) HLADDR
---------- ----------------
        29 00000000973A6C58
        41 00000000973A6E08
        47 00000000973A6EE0

256 rows selected.


SQL> oradebug setmypid;
Statement processed.
SQL> oradebug dump buffers 4;
Statement processed.
SQL> oradebug tracefile_name;
/s01/orabase/diag/rdbms/g11r23/G11R23/trace/G11R23_ora_27444.trc




CHAIN: 165 LOC: 0x973a23b8 HEAD:
  BH (0x7bfeedd8) file#: 4 rdba: 0x01027c00 (4/162816) class: 8 ba: 0x7be6a000
      set: 6 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 78,22
      dbwrid: 0 obj: 81261 objn: 81261 tsn: 4 afn: 4 hint: f
      hash: lru:
      lru-flags: debug_dump
      ckptq: fileq: objq: objaq:
      st: XCURRENT md: NULL fpin: 'ktspfwh6: ktspffbmb' tch: 2
      flags: block_written_once redo_since_read
      LRBA: LSCN: HSCN: HSUB:
         
         
         


CHAIN: 67 LOC: 0x9739d108 HEAD:
    BH (0x7bfd8f88) file#: 4 rdba: 0x01027c01 (4/162817) class: 8 ba: 0x7bc1c000
      set: 5 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 77,22
      dbwrid: 0 obj: 81261 objn: 81261 tsn: 4 afn: 4 hint: f
      hash: lru:
      lru-flags: debug_dump
      ckptq: fileq: objq: objaq:
      st: XCURRENT md: NULL fpin: 'ktspfwh6: ktspffbmb' tch: 2
      flags: block_written_once redo_since_read
      LRBA: LSCN: HSCN: HSUB:
         
         
CHAIN: 192 LOC: 0x973a3a80 HEAD:
  BH (0x7e7f19c8) file#: 4 rdba: 0x01027c80 (4/162944) class: 8 ba: 0x7e6b4000
      set: 6 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 78,22
      dbwrid: 0 obj: 81261 objn: 81261 tsn: 4 afn: 4 hint: f
      hash: lru:
      lru-flags: debug_dump
      ckptq: fileq: objq: objaq:
      st: XCURRENT md: NULL fpin: 'ktspfwh6: ktspffbmb' tch: 2
      flags: block_written_once redo_since_read
      LRBA: LSCN: HSCN: HSUB:

CHAIN: 94 LOC: 0x9739e7d0 HEAD:
    BH (0x7bfda288) file#: 4 rdba: 0x01027c81 (4/162945) class: 8 ba: 0x7bc3c000
      set: 5 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 77,22
      dbwrid: 0 obj: 81261 objn: 81261 tsn: 4 afn: 4 hint: f
      hash: lru:
      lru-flags: debug_dump
      ckptq: fileq: objq: objaq:
      st: XCURRENT md: NULL fpin: 'ktspfwh6: ktspffbmb' tch: 2
      flags: block_written_once redo_since_read
      LRBA: LSCN: HSCN: HSUB:

          以上可以看到 在hash bucket 非常有限的情况下 , 一个bucket 中会存放比 平时多得多的 BH buffer header,


block#  162816  在CHAIN: 165
block#  162817  在CHAIN: 67
block#  162944  在CHAIN: 192
block#  162945  在CHAIN: 94
block#  237568  CHAIN: 97
block#  237569  CHAIN: 255
block#  237570  CHAIN: 157
block#  237571  CHAIN: 59




但是 因为 HASH algorithm  对于 Block的RDBA+CLASS 的散列作用, 相邻的数据块(neighborhood block)会尽可能分在 不同的bucket内。


可以看一下 同一个 table object的 buffer header在 同一个 hash bucket中的情况, 可以看到 这些同一个hash bucket 中的BH 总是在物理上 那样疏远:


CHAIN 245 :(4/233129)  (4/203462)  (4/185178)
CHAIN 247:  (4/223233)  (4/196739) (4/163200)



CHAIN: 245 LOC: 0x973a6738 HEAD:
    BH (0x7b7e9f78) file#: 4 rdba: 0x01038ea9 (4/233129) class: 1 ba: 0x7b5e6000
      set: 5 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 77,22
      dbwrid: 0 obj: 81261 objn: 81261 tsn: 4 afn: 4 hint: f
      hash: lru:
      lru-flags: debug_dump
      ckptq: fileq: objq: objaq:
      st: XCURRENT md: NULL fpin: 'kdswh01: kdstgr' tch: 0
      flags: only_sequential_access prefetched_block
      LRBA: LSCN: HSCN: HSUB:
    BH (0x7bbddcb8) file#: 4 rdba: 0x01031ac6 (4/203462) class: 1 ba: 0x7b89e000
      set: 6 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 78,22
      dbwrid: 0 obj: 81261 objn: 81261 tsn: 4 afn: 4 hint: f
      hash: lru:
      lru-flags: debug_dump
      ckptq: fileq: objq: objaq:
      st: XCURRENT md: NULL fpin: 'kdswh01: kdstgr' tch: 0
      flags: only_sequential_access prefetched_block
      LRBA: LSCN: HSCN: HSUB:
    BH (0x7bbdfcc8) file#: 4 rdba: 0x0102d35a (4/185178) class: 1 ba: 0x7b8d4000
      set: 6 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 78,22
      dbwrid: 0 obj: 81261 objn: 81261 tsn: 4 afn: 4 hint: f
      hash: lru:
      lru-flags: debug_dump moved_to_tail
      ckptq: fileq: objq: objaq:
      st: XCURRENT md: NULL fpin: 'kdswh01: kdstgr' tch: 0
      flags: only_sequential_access
      LRBA: LSCN: HSCN: HSUB:
         
         

aquarius 发表于 2012-5-9 17:07:35

好   谢谢啊   学习了

hctech 发表于 2012-5-9 17:11:49

刘大误会了,我想问的是关于看了您的一篇博文后不明白的地方,
文章名字《latch free:cache buffer handles造成的SQL性能问题》
关于这个栓:
当会话需要pin住buffer header时它首先要获去buffer handle,得到buffer handle的过程中首先要抢占cache buffer handles栓,为了避免对于cache buffer handles栓的过度争用,每个会话被允许cache一小撮buffer handles,也叫保留集(reserved set)。该保留集的上限由隐式参数_db_handles_cached(默认为5)所控制,在此基础上会话在执行不是十分复杂的SQL时不必反复申请栓。


这个栓我在其它地方都没有看到过,从v$latch_children里查看这个栓也是没有子栓的,请教一下关于这个栓的资料~

hctech 发表于 2012-5-9 17:52:14

刚才的回帖被删了还是咋回事啊~~再发一次~~

刘大误会我的意思了,我是想问关于buffer header 上的栓cache buffer handles这方面的资料,因为从来没有地方介绍过这个栓,在您的文章《latch free:cache buffer handles造成的SQL性能问题》里:
当会话需要pin住buffer header时它首先要获去buffer handle,得到buffer handle的过程中首先要抢占cache buffer handles栓,为了避免对于cache buffer handles栓的过度争用,每个会话被允许cache一小撮buffer handles,也叫保留集(reserved set)。该保留集的上限由隐式参数_db_handles_cached(默认为5)所控制,在此基础上会话在执行不是十分复杂的SQL时不必反复申请栓。

说到了这个栓,所以想请教一下相关资料~

另外我发现这个栓在latch children里没有子栓,它是如何工作的呢~

Maclean Liu(刘相兵 发表于 2012-5-9 18:07:15

回复 8# 的帖子

这个帖子由于 原帖没有表达清楚,现改为对 cache buffer chain 、hash bucket、hash chain的讨论

如果对 buffer handle有疑问 请另外开一个帖子

soho00222 发表于 2012-5-9 22:17:56

  --------------------------------------------------------------------------------例如 data file 4 上的 block 18 和 block 19是 应用经常要访问的热快, 经过HASH算法之后 这2个块 就不会落在同一个HASH Buckets中,这样避免了对 同一条hash chain的争用
  --------------------------------------------------------------------------------
一个hash chain可以同时对应多个hash buckets,两个data block即使分别在不同的hash buckets,还是会可能产生争用。

Maclean Liu(刘相兵 发表于 2012-5-9 22:35:54

回复 10# 的帖子

以下演示 用以证明 hash chains 和 hash bucket 是 一对一的关系


SQL> show parameter hash

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_db_block_hash_buckets               integer     256

参数指定 256个 hash buckets

SQL> oradebug setmypid;
Statement processed.
SQL> oradebug dump buffers 4;
Statement processed.
SQL> oradebug tracefile_name;
/s01/orabase/diag/rdbms/g11r23/G11R23/trace/G11R23_ora_29099.trc

CHAIN: 0 LOC: 0x97399880 HEAD:

CHAIN: 242 LOC: 0x973a64b0 HEAD:
CHAIN: 243 LOC: 0x973a6588 HEAD:
CHAIN: 244 LOC: 0x973a6660 HEAD:
CHAIN: 245 LOC: 0x973a6738 HEAD:
CHAIN: 246 LOC: 0x973a6810 HEAD:
CHAIN: 247 LOC: 0x973a68e8 HEAD:
CHAIN: 248 LOC: 0x973a69c0 HEAD:
CHAIN: 249 LOC: 0x973a6a98 HEAD:
CHAIN: 250 LOC: 0x973a6b70 HEAD:
CHAIN: 251 LOC: 0x973a6c48 HEAD:
CHAIN: 252 LOC: 0x973a6d20 HEAD:
CHAIN: 253 LOC: 0x973a6df8 HEAD:
CHAIN: 254 LOC: 0x973a6ed0 HEAD:
CHAIN: 255 LOC: 0x973a6fa8 HEAD:


从buffer dump中可以明确 看到 chain 0 - chian 255  , 256 个 hash chains

Maclean Liu(刘相兵 发表于 2012-5-9 22:54:03

补充一下:

说2个块 不在同一个 hash chains 就不会造成cbc latch争用 是不准确的,  上面的说明中 这样解释 是为了容易理解。  实际 一个cache buffer chains latch 会管理多个 cache buffer chain ,所以若 2个 data buffer header 恰好在 同一个 cbc latch 管理的 hash chains上的话 还是有可能造成 contention 。  但是 hash fun 会尽可能让  相邻块(neighborhood block) 分布在不同 latch 管理的 hash chains上。


SQL> select count(*) from test_buffer_bucket;

  COUNT(*)
----------
     75315
         

SQL> select count(*) from test_buffer_bucket;

  COUNT(*)
----------
     75315


select DBABLK,HLADDR from x$bh where OBJ=81261 order by DBABLK         ;


HLADDR  RAW(4) Hash Chain Latch Address
.................................................
   DBABLK HLADDR
---------- ----------------
    233122 00000000973A1F90
    233123 000000009739CDB8
    233124 00000000973A5308
    233125 00000000973A0058
    233126 000000009739ADA8
    233127 00000000973A32F8
    233128 000000009739E120
    233129 00000000973A6670
    233392 00000000973A02E0
    234798 000000009739F710
    237424 000000009739EA68

    DBABLK HLADDR
---------- ----------------
    237425 00000000973997B8
    237426 00000000973A1D08
    237427 000000009739CA58
    237428 00000000973A4FA8
    237429 000000009739FDD0
    237430 000000009739AB20
    237431 00000000973A3070

Maclean Liu(刘相兵 发表于 2012-5-9 23:00:26

MORE ODM FINDING:

Hash Buckets and Chains
Any access to the hash chain is protected by the corresponding cache buffers chains latch. The hash chain itself is updated via a generic link list mechanism. Although each hash bucket has a cache buffers chains latch to protect concurrent access to the chain, it is not necessarily a one-to-one correspondence because multiple buckets may share a latch. The default number of these latches is calculated as: Initial = buffers / 128. This is adjusted upward if it is too low.

Default number of hash buckets: (DB_BLOCK_BUFFERS x 2)
The parameter _DB_BLOCK_HASH_BUCKETS can be used to overwrite the default.
Each hash bucket contains a chain of buffer headers for a set of <RDBA, class> pairs.
Each hash bucket has a cache buffers chains latch to protect concurrent access to the chain.

shinee 发表于 2012-5-10 09:10:24

真不错..学习了...

hctech 发表于 2012-5-10 09:54:29

回复 10# 的帖子

8#确定是这样?应该是一个bucket就是一个chain吧?然后一个latch可以管理多个chain

wzhihua 发表于 2012-5-10 22:04:40

maclean,看了半天还是没明白cache buffer chain与 hash chain有什么区别。
到底有几条chain?一条还是两条?是不是cache buffer chain、 hash chain是一个东西??

Maclean Liu(刘相兵 发表于 2012-5-10 22:19:59

cache buffer chain 简写为cbc 也就叫做  cache buffer hash chain

wzhihua 发表于 2012-5-10 22:22:53

仔细看了下,chche buffer chain与hash chain应该是指同一个东西。
再请教一下,在5#中
(1)select count(*) ,HLADDR from x$bh group by HLADDR;
中的hladdr指的是谁的地址?与dump buffers的trace文件中的哪个地址相对应?
(2)为何chain 165,chain 67,chain 192,chain 94 中都只有一个bh?而x$bh的查询结果中都有几十个bh?

wzhihua 发表于 2012-5-14 17:59:27

这两天上网查了下资料,select count(*) ,HLADDR from x$bh group by HLADDR 中的hladdr应该是cache buffer chain latch 的address,在刘大的实验中"_db_block_hash_buckets"=256 ,此时一个cbc chain   latch 管理一个 bucket。不知道这样的理解是否准确??

Maclean Liu(刘相兵 发表于 2012-5-14 20:24:09

cache buffer hash chains 数量越少 则 单个 cbc latch管理的 chains 越少, 最少的情况下 一个 cbc latch 管理 一条 cbc chains

SQL> select  * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0      Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production









SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
  2   FROM SYS.x$ksppi x, SYS.x$ksppcv y
  3   WHERE x.inst_id = USERENV ('Instance')
  4   AND y.inst_id = USERENV ('Instance')
  5   AND x.indx = y.indx
  6  AND x.ksppinm='_db_block_hash_buckets';
  
  
  NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
DESCRIB
--------------------------------------------------------------------------------
_db_block_hash_buckets
1048576
Number of database block hash buckets



SQL> select count(distinct(HLADDR)) from x$Bh;

COUNT(DISTINCT(HLADDR))
-----------------------
                   4539
                                  
SQL> alter system set "_db_block_hash_buckets"=1024 scope=spfile;

System altered.

SQL> startup force;
ORACLE instance started.

Total System Global Area  851443712 bytes
Fixed Size                  2100040 bytes
Variable Size             738198712 bytes
Database Buffers          104857600 bytes
Redo Buffers                6287360 bytes
Database mounted.
Database opened.
SQL> show parameter hash

NAME                                 TYPE
------------------------------------ --------------------------------
VALUE
------------------------------
_db_block_hash_buckets               integer
1024                                  
                                  
                                  
                                  

SQL> select count(distinct(HLADDR)) from x$Bh;

COUNT(DISTINCT(HLADDR))
-----------------------
                    998

fibonacci 发表于 2013-12-6 16:39:14

hash bucket的结构是怎么样的,他里面是不是放的就是一个一个bufer header 和 class 经过hash运算后的值?

Liu Maclean(刘相兵 发表于 2013-12-6 21:05:29

fibonacci 发表于 2013-12-6 16:39 static/image/common/back.gif
hash bucket的结构是怎么样的,他里面是不是放的就是一个一个bufer header 和 class 经过hash运算后的值? ...

最好搞过C和数据结构,否则听了还是玄虚

lunar 发表于 2013-12-7 10:34:48

虽然看不懂,但是感觉这个好精彩的扫盲贴,改天头脑清醒的时候学习下,O(∩_∩)O哈哈~
页: [1]
查看完整版本: 关于cache buffer chain 、hash bucket、hash chain的讨论