数据读取之逻辑读简单解析--关于BUFFER CACHE
来源:互联网 发布:数据的统计分析 编辑:程序博客网 时间:2024/05/19 23:27
数据读取之逻辑读简单解析--BUFFER CACHE 关于consistent read--一致性读--Logical read-逻辑读-current read当前读--物理读,详见:http://blog.csdn.net/haibusuanyun/article/details/11489091
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-内存结构图解
#############################
-->>首先查出第一行数据的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,至此一次逻辑读的操作才全部完成。。
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
一、实验数据准备--查出一条数据的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 X2.进入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
- buffer cache实验9-从buffer caceh中读取数据块解析-从逻辑读到物理读
- 逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
- 逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
- 逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
- 逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
- Oracle 学习之--Buffer Cache深入解析
- buffer cache 深度解析+
- +++++buffer cache 深度解析
- buffer cache 深度解析
- buffer cache 深度解析
- BUFFER CACHE之二:管理buffer cache
- Oracle内存详解之四 Buffer Cache 数据缓冲区
- Oracle内存详解之四 Buffer Cache 数据缓冲区
- Oracle内存详解之四 Buffer Cache 数据缓冲区
- 关于json解析、读取数据
- I/O之内核buffer-“buffer cache”
- IO之内核buffer----"buffer cache"
- android银联支付
- “中国杯”游戏极限开发大赛 12月20日隆重开启
- Extjs 获取页面元素放到一个combox 中显示
- 原生AJAX调用四步曲:仅供初学者参考
- 信息系统项目管理师==之==项目管理9大管理过程知识点概要
- 数据读取之逻辑读简单解析--关于BUFFER CACHE
- 心痛的时候抱抱自己
- 1039:词组缩写
- 获取Multipatch图层中模型的底面图形和模型的高度
- 神马是敏捷?(4)——敏捷不能当饭吃
- mono touch中touch触发对象判断
- C#中去掉Toolstrip边框的方法
- Spring3 MVC 笔记(二) —json+rest优化
- 顺序表的实现