设为首页 加入收藏

TOP

物理读之LRU(最近最少被使用)的深入解析(一)
2014-11-24 07:55:30 来源: 作者: 【 】 浏览:4
Tags:物理 LRU 最近 最少 使用 深入 解析

转载请注明出处:

http://blog.csdn.net/guoyjoe/article/details/38264883

一组LRU链表包括LRU主链,LRU辅助链,LRUW主链,LRUW辅助链,称为一个WorkSet(工作组)如下图:

\

sys@ZMDB> select CNUM_SET,CNUM_REPL,ANUM_REPL,CNUM_WRITE,ANUM_WRITE from x$kcbwds where CNUM_SET>0;

  CNUM_SET  CNUM_REPL  ANUM_REPL CNUM_WRITE ANUM_WRITE
---------- ---------- ---------- ---------- ----------
     15221      15221       3796          0          0
     15221      15221       3783          0          0

CNUM_SET:工作组总的buffer总数量

CNUM_REPL:工作组中LRU的buffer总数量(主LRU+辅LRU)

ANUM_REPL:工作组中辅LRU总BUFFER的数量

通过隐含参数查到BUFFER的总的个数是30442,正好与上面的CNUM_SET=15221+15221

sys@ZMDB> @ /rdbms/admin/show_para 
Enter value for p: _db_block_buffers
old  12:     AND upper(i.ksppinm) LIKE upper('%&p%')
new  12:     AND upper(i.ksppinm) LIKE upper('%_db_block_buffers%')

P_NAME                                   P_DESCRIPTION                                      P_VALUE                        ISDEFAULT ISMODIFIED ISADJ
---------------------------------------- -------------------------------------------------- ------------------------------ --------- ---------- -----
_db_block_buffers                        Number of database blocks cached in memory: hidden 30442                          TRUE      FALSE        FALSE
                                          Parameter
我们用以下语句查下 数据库中buffer所在LRU的状态
sys@ZMDB> select lru_flag,count(*) from x$bh group by lru_flag;

  LRU_FLAG   COUNT(*)
---------- ----------
         6        208
         2         10
         4       7122
         8      15199
0	7646
我们对LRU_FLAG=6,2,4,8,0等做出解释,举个例子,对于6是什么含义呢?

首先要在x$bh中找到lru_flag=6的任意的一个BUFFER

sys@ZMDB> select LRU_FLAG,LOWER(BA)from x$bh where lru_flag=6 and rownum=1;

  LRU_FLAG LOWER(BA)
---------- ----------------
         6 0000000081dae000

DUMP buffer_cache中BH信息,如下命令:

sys@ZMDB> alter session set events'immediate trace name buffers level 1';

Session altered.
ys@ZMDB> col value for a85
sys@ZMDB> select * from v$diag_info where name='Default Trace File';

   INST_ID NAME                                               VALUE
---------- -------------------------------------------------- -------------------------------------------------------------------------------------
1	Default Trace File                                 /u01/app/oracle/diag/rdbms/zmdb/zmdb/trace/zmdb_ora_13235.trc

通过BA=81dae000搜索trace文件,

/u01/app/oracle/diag/rdbms/zmdb/zmdb/trace/zmdb_ora_13235.trc

得到如下内容:

BH (0x81fe7e38) file#: 1 rdba: 0x0040ace1 (1/44257) class: 1 ba: 0x81dae000
  set: 6 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
  dbwrid: 0 obj: 421 objn: 423 tsn: 0 afn: 1 hint: f
  hash: [0x9ef9d710,0x853f8da8] lru: [0x81fe7df0,0x81fe8050]
  lru-flags: moved_to_tail on_auxiliary_list
  ckptq: [NULL] fileq: [NULL] objq: [NULL] objaq: [NULL]
  st: CR md: NULL fpin: 'kdswh06: kdscgr' tch: 1
  cr: [scn: 0x0.80350f4d],[xid: 0x0.0.0],[uba: 0x0.0.0],[cls: 0x0.80350f4d],[sfl: 0x0],[lc: 0x0.8034c532]
  flags: block_written_once redo_since_read
LRU_FLAG=6的意思是lru-flags:moved_to_tail on_auxiliary_list,就是向LRU的辅助链表的尾部移动,这有可能是SMON从LRU的主链表上的非脏块、TCH<=1并且状态是非PIN的BUFFER被挂接到LRU辅助链表的尾部。

根据以上的方法同理可以解释出LRU_FLAG的含义:

LRU_FLAG

0==>LRU-主链冷端的头部,这个比较特殊他在DUMP没有显示LRU_FLAG

2==>LRU-主链冷端的尾部,lru-flags:moved_to_tail

4==>LRU-辅助链,lru-flags:on_auxiliary_list

6==>LRU-辅助链的尾部,lru-flags:moved_to_tail on_auxiliary_list

8==>LUR-主链热端,lru-flags:hot_buffer

当发生物理读时,Oracle会从LRU辅助链表找空闲的BUFFER,然后把LRU辅助的链上的BUFFER挂接到LRU主链的冷端头,实验如下:

首先要保证有LRU辅助链上的BUFFER,即有LRU_FLAG=6或LRU_FLAG=4,如果数据库刚刚启来,可能没有LRU_FLAG=6、LRU_FLAG=4,那需要做大量的物理读操作,才会有LRU_FLAG=6或LRU_FLAG=4

sys@ZMDB> alter system flush buffer_cache;

System altered.

sys@ZMDB> select lru_flag,co
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇PostgresQL基本使用 下一篇数据库多表操作

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中,“指针”用 (2025-12-26 15:20:18)
·在c语言的指针运算中 (2025-12-26 15:20:15)
·C语言-函数指针与函 (2025-12-26 15:20:12)
·求navicat for mysql (2025-12-26 13:21:33)
·有哪位大哥推荐一下m (2025-12-26 13:21:30)