数据读取之逻辑读简单解析--关于BUFFER CACHE

原创 2013年12月05日 13:55:44
数据读取之逻辑读简单解析--BUFFER CACHE   关于consistent read--一致性读--Logical read-逻辑读-current read当前读--物理读,详见:http://blog.csdn.net/haibusuanyun/article/details/11489091

一、实验数据准备--查出一条数据的ROWID,及FILE_ID,BLOCK_ID等信息

BYS@ bys3>select rowid,test.* from test where rownum=1;
ROWID              OBJECT_NAME   OBJECT_ID STATUS
------------------ ------------ ---------- -------
AAAFSJAAEAAAACrAAA UNDO$                15 VALID
使用下面语句查出相应行的FILE_ID,BLOCK_ID,关于ROWID,详见:http://blog.csdn.net/q947817003/article/details/11490051
col object_name for a12
col colname for a10
select a.rowid,a.object_id,a.file_id,a.block_id,a.row_num,b.object_name,a.colname from
(select rowid,
dbms_rowid.rowid_object(rowid) object_id,
dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.rowid_row_number(rowid) row_num,
&colname as colname from &tablename t) a,
dba_objects b
where a.object_id=b.object_id;
运行上述语句,按提示输入:&colname 列名 ;&tablename 表名即可显示类似以下信息:  我这里是输入 test 表的object_name列
ROWID               OBJECT_ID    FILE_ID   BLOCK_ID    ROW_NUM OBJECT_NAME  COLNAME
------------------ ---------- ---------- ---------- ---------- ------------ ----------
AAAFSJAAEAAAACrAAD      21641          4        171          3 TEST         I_USER1
AAAFSJAAEAAAACrAAC      21641          4        171          2 TEST         CON$
AAAFSJAAEAAAACrAAB      21641          4        171          1 TEST         ICOL$
AAAFSJAAEAAAACrAAA      21641          4        171          0 TEST         UNDO$
#############################

二、关于BH buffer header,buckets,block_buffers介绍:

详见: buffer cache实验1-内存结构图解

#############################


三.结合图1,解析发出查询语句,ORACLE如何读数据?

select a from b where rownum=1;语句发出后,---只涉及buffer cache中的读取,语句的解析暂不考虑,以后补充吧。
-->>首先查出第一行数据的ROWID--使用有dbms_rowid.ROWID_BLOCK_NUMBER(rowid),
-->>根据ROWID得出DBA
-->>到SGA中BUFFER CACHE查找此数据。      
-->>首先把DBA信息使用内部HASH函数进行运算
-->>根据生成值找到相应HASH BUCKET(包含首、尾BH地址)  --共享池
-->>通过HASH BACKET找到cache buffers chains--此步需要先要获取latch:cache buffers chains
-->>在cache buffers chains上顺序查询到所需BH buffer header --通过内部表x$bh,在BH中找到BA信息 buffer address
-->>根据BH中的BA信息,就找到了BUFFER CACHE中存放所要查询数据块具体数据的内存块---此步需要先获取Buffer pin S (0-->1)--在BH上加此锁
-->>返回数据至相应的查询进程;一次逻辑读的读取操作到此完成此后还需要释放在BH上的Buffer pin S 锁
-->>此时需要先获取latch:cache buffers chains,
-->>在上一步获取的latch:cache buffers chains保护下,将BH上的BH上的Buffer pin S 锁释放(1-->0)
-->>释放latch:cache buffers chains,至此一次逻辑读的操作才全部完成。。

四、总结:一次逻辑读时CBC latch锁及Buffer pin锁的获取和释放过程如下:

1.加Latch X
2.进入hash chain,在相应的BH上加Buffer pin S (0-->1)
3.释放Latch X
4.进行逻辑读--也就是通过BH中的buffer adderss找到数据块在内存中真实位置  ---假如读了1MS
5.加Latch X
6.释放Buffer pin S (1-->0)  0:没锁  1:共享锁  2:独占锁
7.释放Latch X
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

buffer cache实验9-从buffer caceh中读取数据块解析-从逻辑读到物理读

就以上图为例,文字描述分析一下前台进程发出查询语句时获取所需数据块的过程: 注:本文不涉及SQL语句的解析部分、客户端与服务器交互等,只涉及buffer cache。 这里的物理读是非直接路径读、非大...

Oracle Buffer-cache (数据高速缓存)作用概述

这篇文章是参考甲骨论老相老师所做的教学视频所做的学习笔记. http://v.youku.com/v_show/id_XMzkyMTk3ODM2.html 首先简单说明一下Oracle...
  • nvd11
  • nvd11
  • 2013年04月02日 00:56
  • 592

Oracle内存详解之四 Buffer Cache 数据缓冲区

一. 官网说明 Memory Architecture http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/memory....

Oracle内存详解之四 Buffer Cache 数据缓冲区

一. 官网说明 Memory Architecture http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/mem...

使用events DUMP buffer cache中指定的数据块

介绍了DUMP  buffer cache中全部数据块及指定RDBA的数据块方法。 1.DUMP  buffer cache中全部数据块 ALTER SESSION SET EVENTS ‘imme...

buffer cache 深度解析+

本文内同整理自网络:     本文首先详细介绍了oracle中buffer cache的概念以及所包含的内存结构。然后结合各个后台进程(包括DBWRn、CKPT、LGWR等)深入介绍了oracle对于...

buffer cache 深度解析

本文内容整理自网络:     本文首先详细介绍了oracle中buffer cache的概念以及所包含的内存结构。然后结合各个后台进程(包括DBWRn、CKPT、LGWR等)深入介绍了oracle对...

1.物理读(physical read)2.逻辑读(buffer read)

1.物理读(physical read) 当数据块第一次读取到,就会缓存到buffer cache 中,而第二次读取和修改该数据块时就在内存buffer cache 了 以下是例子: 1.1  第...

linux内存中buffer与cache的区别

  • 2013年09月23日 01:29
  • 21KB
  • 下载

Oracle Buffer和Cache的区别

  • 2013年10月12日 14:20
  • 14KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据读取之逻辑读简单解析--关于BUFFER CACHE
举报原因:
原因补充:

(最多只允许输入30个字)