热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

物理读之LRU(最近最少被使用)的深入解析

一组LRU链表包括LRU主链,LRU辅助链,LRUW主链,LRUW辅助链,称为一个WorkSet(工作组)如下图:650)this.srcwww.68idc.cnhelpuploadsallimg15121410060LM3-0.jpgtitle111.pngaltwKioL1PXLA_RrQwAAAE_O1bng

一组 LRU 链表包括 LRU 主链, LRU 辅助链, LRUW 主链, LRUW 辅助链,称为一个 WorkSet( 工作组 ) 如下图: 650) this.width=650;" src="http://www.68idc.cn/help/uploads/allimg/151214/10060LM3-0.jpg" title="111.png" alt="wKioL1PXLA_RrQwAAAE_O1bng

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

wKioL1PXLA_RrQwAAAE_O1bngXE780.jpg

sys@ZMDB> selectCNUM_SET,CNUM_REPL,ANUM_REPL,CNUM_WRITE,ANUM_WRITE from x$kcbwds whereCNUM_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:工作组中LRUbuffer总数量(主LRU+LRU

ANUM_REPL:工作组中辅LRUBUFFER的数量

通过隐含参数查到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) LIKEupper('%&p%')

new 12: AND upper(i.ksppinm) LIKEupper('%_db_block_buffers%')

P_NAME P_DESCRIPTION P_VALUE ISDEFAULT ISMODIFIEDISADJ

------------------------------------------------------------------------------------------------------------------------ --------- ---------- -----

_db_block_buffers Number of database blocks cached inmemory: 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=62480等做出解释,举个例子,对于6是什么含义呢?

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

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

LRU_FLAG LOWER(BA)

---------- ----------------

6 0000000081dae000

DUMP buffer_cacheBH信息,如下命令:

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 TraceFile';

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: 1hint: 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的辅助链表的尾部移动,这有可能是SMONLRU的主链表上的非脏块、TCH<=1并且状态是非PINBUFFER被挂接到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=6LRU_FLAG=4,如果数据库刚刚启来,可能没有LRU_FLAG=6LRU_FLAG=4,那需要做大量的物理读操作,才会有LRU_FLAG=6LRU_FLAG=4

sys@ZMDB> alter system flush buffer_cache;

System altered.

sys@ZMDB> selectlru_flag,count(*) from x$bh group by lru_flag;

LRU_FLAG COUNT(*)

---------- ----------

6 208

4 30009

0 2

第一次DUMP整个BUFFER CACHE:

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

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

发生物理读

gyj@ZMDB> conn gyj/gyj

Connected.

gyj@ZMDB> set autot on;

gyj@ZMDB> select id,name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid)block# from gyj_t1 where id=1;

ID NAME FILE# BLOCK#

---------- ---------------------------------------- ----------

1 gyj1 7 139

Execution Plan

----------------------------------------------------------

Plan hash value: 59758809

----------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 14 | 68 (0)| 00:00:01 |

|* 1 | TABLE ACCESS FULL| GYJ_T1 | 1| 14 | 68 (0)| 00:00:01 |

----------------------------------------------------------------------------

Predicate Information(identified by operation id):

---------------------------------------------------

1 - filter("ID"=1)

Statistics

----------------------------------------------------------

1 recursive calls

1 db block gets

254 consistent gets

248 physical reads

0 redo size

733 bytes sent via SQL*Net to client

523 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

sys@ZMDB> selectLRU_FLAG,lower(BA),TCH from x$bh where file#=7 and dbablk=139;

LRU_FLAG LOWER(BA) TCH

---------- --------------------------

0 000000007d1b2000 1

4 0000000078558000 0

4 0000000085f68000 0

物理读完成后,再次dump整个buffer cache,

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

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

BA=7d1b2000,搜索第一次DUMPtrace文件

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

BH (0x7d3e8098) file#: 3 rdba:0x00c0586b (3/22635) class: 34 ba: 0x7d1b2000

set: 5 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc:0,25

dbwrid:0 obj: -1 objn: 0 tsn: 2 afn: 3 hint: f

hash: [0x9efa7570,0x9efa7570] lru:[0x7f7f5d30,0x7d3e8050]

lru-flags: on_auxiliary_list

ckptq: [NULL] fileq: [NULL] objq: [NULL]objaq: [NULL]

st: FREE md: NULL fpin: 'ktuwh03: ktugnb'tch: 0 lfb: 33

flags:

BA=7d1b2000,搜索第二次DUMPtrace文件

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

BH (0x7d3e8098) file#: 7 rdba:0x01c0008b (7/139) class: 1 ba: 0x7d1b2000

set: 5 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc:0,25

dbwrid: 0 obj: 22919 objn: 19567 tsn: 7 afn:7 hint: f

hash: [0x787e4bd8,0x9e4cda50] lru:[0x7f7f5d30,0x7d3e8050]

ckptq: [NULL] fileq: [NULL] objq:[0x9a88e518,0x7d3e8078] objaq: [0x9a88e508,0x7d3e8088]

st: XCURRENT md: NULL fpin: 'kdswh11:kdst_fetch' tch: 1

flags: only_sequential_access

LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN:[0xffff.ffffffff] HSUB: [65535]

从上面的两个trace可以得出结论ba: 0x7d1b2000

lru-flags:on_auxiliary_list(LRU_FLAG=4)LRU-主链冷端的头部,这个比较特殊在DUMP没有显示LRU_FLAG(LRU_FLAG=0)

观察LRUTCH>=2时冷端移到热端

1BUFFER手动设为100M

ALTER SYSTEM SETmemory_max_target=0 scope=spfile;

ALTER SYSTEM SET memory_target=0;

alter system set sga_target=0;

create table gyj1_t80 (idint,name char(2000));

create table gyj2_t80 (idint,name char(2000));

begin

for i in 1 .. 30000

loop

insert into gyj1_t80 values(i,'gyj'||i);

commit;

end loop;

end;

/

SQL> SQL> selectbytes/1024/1024||'M' from dba_segments where segment_name='GYJ1_T80' andowner='GYJ';

BYTES/1024/1024||'M'

-----------------------------------------

80M

begin

for i in 1 .. 30000

loop

insert into gyj2_t80 values(i,'gyj'||i);

commit;

end loop;

end;

/

create index idx_gyj1_t80m ongyj1_t80(id);

create index idx_gyj2_t80m ongyj2_t80(id);

SQL> show user;

USER is "GYJ"

SQL> conn / as sysdba

Connected.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

第一次dump

SQL> alter session set events'immediate trace name buffers level1';

Session altered.

SQL> select * fromv$diag_info where name='Default Trace File';

INST_ID NAME

---------- --------------------

VALUE

--------------------------------------------------------------------------------

1 Default Trace File

/u01/app/oracle/diag/rdbms/jfdb/jfdb/trace/jfdb_ora_7210.trc

发生一个物理读走索引

set autot on

selectid,name,dbms_rowid.rowid_relative_fno(rowid)file#,dbms_rowid.rowid_block_number(rowid) block# from gyj1_t80 where id=1;

SQL> selectid,name,dbms_rowid.rowid_relative_fno(rowid)file#,dbms_rowid.rowid_block_number(rowid) block# from gyj1_t80 where id=1;

ID NAME FILE# BLOCK#

------------------------------ ---------- ----------

1 gyj1 5 581

select LRU_FLAG,lower(BA),TCHfrom x$bh where file#=5 and dbablk=581;

SQL> select LRU_FLAG,lower(BA),TCH,decode(state,0,'free',1,'xcur',2,'scur'

2 ,3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,

3 'donated', 12,'protected', 13,'securefile', 14,'siop',15,'recckpt', 16, 'flashf

4 ree', 17, 'flashcur', 18,'flashna') from x$bh where file#=5 anddbablk=581;

LRU_FLAG LOWER(BA) TCH DECODE(STA

---------- -------------------------- ----------

0 000000009fca8000 1 xcur

SQL> selectLRU_FLAG,lower(BA),TCH from x$bh where file#=5 and dbablk=581;

LRU_FLAG LOWER(BA) TCH

---------- --------------------------

0 000000009fca8000 5

SQL> set autot traceonly;

SQL> select /*+ index(G) */ count(name) fromgyj1_t80 G where id<=8000;

SQL> selectLRU_FLAG,lower(BA),TCH from x$bh where file#=5 and dbablk=581;

LRU_FLAG LOWER(BA) TCH

---------- --------------------------

0 000000009fca8000 6

再次发生物理读,此时LRU_FLAG=0变为8,同时TCH=8重置为0

SQL>select LRU_FLAG,lower(BA),TCH from x$bh where file#=5 and dbablk=581;

LRU_FLAG LOWER(BA) TCH

---------- ---------------- ----------

0000000009fca8000 8

SQL> select LRU_FLAG,lower(BA),TCH from x$bh where file#=5 anddbablk=581;

LRU_FLAG LOWER(BA) TCH

---------- ---------------- ----------

8000000009fca8000 0

BH (0x9ffe02a8) file#: 5 rdba: 0x01400245 (5/581) class: 1 ba:0x9fca8000

set: 5 pool: 3 bsz: 8192bsi: 0 sflg: 2 pwc: 15,19

dbwrid: 0 obj: 13537 objn:13537 tsn: 5 afn: 5 hint: f

hash:[0xb6a86de0,0xb6a86de0] lru: [0x9ffe0260,0x9ffe9a60]

lru-flags: hot_buffer

ckptq: [NULL] fileq: [NULL]objq: [0x9ffe0618,0x9ffe0028] objaq: [0x9ffe0628,0x9ffe0038]

st: XCURRENT md: NULL fpin:'kdswh05: kdsgrp' tch: 0

flags:

LRBA: [0x0.0.0] LSCN:[0x0.0] HSCN: [0xffff.ffffffff] HSUB: [65535]

TCH=0时,再发生大量物理读,地址为9fca8000BUFFER就被重用了,彻底从BUFFER消失

SQL> selectLRU_FLAG,lower(BA),TCH from x$bh where file#=5 and dbablk=581;

LRU_FLAG LOWER(BA) TCH

---------- --------------------------

8 000000009fca8000 0

SQL> select LRU_FLAG,lower(BA),TCH from x$bh wherefile#=5 and dbablk=581;

no rows selected

通过实验,我们更清楚地了解到物理读LRU的基本流程,可以进一步理解物理读内部的LRU算法。

推荐阅读
  • 远程访问用户 Kindle通过电子书实现控制
    介绍自2007年以来,亚马逊已售出数千万台Kindle,令人印象深刻。但这也意味着数以千万计的人可能会因为这些Kindle中的软件漏洞而被黑客入侵。他 ... [详细]
  • 大数据SQL优化:全面解析数据倾斜解决方案
    本文深入探讨了大数据SQL优化中的数据倾斜问题,提供了多种解决策略和实际案例,旨在帮助读者理解和应对这一常见挑战。 ... [详细]
  • 多级商品分类系统设计方案
    本文介绍了如何设计一个包含一级、二级和三级分类的商品分类系统。通过具体的SQL语句示例,详细阐述了各分类表的结构及字段含义,同时探讨了平台属性与属性值在商品检索中的应用。 ... [详细]
  • 本文提供了一个详细的示例,展示了如何使用Java语言创建一个名为Calculator的类,该类能够执行两个数字之间的基本数学运算,包括加法、减法、乘法和除法。 ... [详细]
  • 本文详细解析了LeetCode第581题——最短无序连续子数组的解决方案,重点介绍了贪心算法的应用及其具体实现步骤。 ... [详细]
  • 本文探讨了归并排序算法在求解逆序数问题中的应用,并对比分析了两种实现方法。第一种方法使用指针和动态数组,存在内存管理上的风险;而第二种方法通过引入临时数组简化了实现过程,提高了代码的健壮性和可读性。 ... [详细]
  • 深入解析Hcash的PoW+PoS混合共识机制优势
    本文探讨了Hcash项目如何通过结合工作量证明(PoW)和权益证明(PoS)两种共识机制,有效解决了单一机制下的诸多问题,如资源浪费、决策集中及安全风险等,实现了更广泛的社区参与和更高的安全性。 ... [详细]
  • ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ... [详细]
  • 本文深入探讨 JavaScript 中的 String 类型及其常见操作方法,包括字符串的创建、转换以及一些常用的字符串处理函数。 ... [详细]
  • 本文探讨了Thrift作为一款支持多语言的服务开发框架,其在体积、功能、扩展性以及多协议支持等方面的显著优势。特别地,Thrift作为一种RPC(远程过程调用协议)框架,非常适合用于构建可扩展且低耦合的分布式服务系统。文章通过多种编程语言对Thrift服务进行了性能测试,并提供了详细的测试结果。 ... [详细]
  • 通过学习《Think Python》,我对Python编程有了初步了解,但在使用第三方库方面仍感到陌生。近期因百度空间即将关闭,我打算利用Evi1m0提供的Python爬虫代码备份个人网站,过程中遇到了第三方库安装的问题。 ... [详细]
  • 运用DDD分层架构优化微服务代码设计
    在微服务实施过程中,确定合理的代码结构至关重要。本文探讨了如何利用领域驱动设计(DDD)的分层架构来优化微服务的代码模型,确保系统的可维护性和扩展性。 ... [详细]
  • 本文详细介绍了快速排序算法的工作原理和实现步骤,包括选择基准值、分区过程以及递归调用等关键环节。通过具体的Java代码示例,帮助读者更好地理解和掌握这一高效的排序算法。 ... [详细]
  • 本文总结了几个常用的Android开发技巧,包括检测设备上是否安装特定应用、获取应用的版本名称、设置状态栏透明以及如何从一个应用跳转至另一个应用的方法。 ... [详细]
  • 本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ... [详细]
author-avatar
郭城镣
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有