資料讀取之邏輯讀簡單解析--關於BUFFER CACHE

還不算暈發表於2013-12-05
資料讀取之邏輯讀簡單解析--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

相關文章