資料讀取之邏輯讀簡單解析--關於BUFFER CACHE
資料讀取之邏輯讀簡單解析--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實驗9-從buffer caceh中讀取資料塊解析-從邏輯讀到物理讀
- 硬解析物理讀VS軟解析邏輯讀 測試
- 有關oracle邏輯讀和物理讀Oracle
- 硬解析和物理讀取與軟解析和邏輯讀取
- cache buffer chain latch只讀共享?AI
- 從Data Buffer中讀資料是單塊讀,還是多塊讀?
- Oracle物理讀和邏輯讀Oracle
- 關於前端資料&邏輯的思考前端
- 基於UNIX系統,邏輯故障的資料災難解讀
- DELETE資料導致INSERT邏輯讀增加delete
- oracle 物理讀 邏輯讀的理解Oracle
- oracle 物理讀,邏輯讀的理解Oracle
- 關鍵字: 讀取表單中最簡單的資料
- oracle邏輯讀過程Oracle
- Oracle邏輯讀詳解Oracle
- iOS 簡單資料的讀寫iOS
- cache buffer chain latch可以以只讀模式共享AI模式
- 什麼是oracle 邏輯讀?Oracle
- 白繕大師關於buffer cache系列
- 用資料解讀直播競答APP的營銷邏輯APP
- 【Oracle】-【插入讀取順序】-插入讀取之間的順序關係Oracle
- 在Oracle中,什麼是物理讀和邏輯讀?Oracle
- sql生成可讀性邏輯圖SQL
- 深入瞭解ORACLE的邏輯讀Oracle
- 從《英雄聯盟》手遊成績看解讀資料的邏輯
- LINQ讀取簡單的XML資料XML
- page cache與buffer cache的關係
- 邏輯資料庫設計 - 單純的樹(遞迴關係資料)資料庫遞迴
- Buffer Cache Size(資料緩衝區)
- 【SQL 優化】異常的邏輯讀SQL優化
- 關於ORACLE裡的buffer cache 的命中率Oracle
- ORACLE 物理讀 邏輯讀 一致性讀 當前模式讀總結淺析Oracle模式
- 資料庫 Mysql 邏輯架構簡介資料庫MySql架構
- SAP Spartacus home 頁面讀取 product 資料的請求的 population 邏輯
- 求救:關於讀取excel資料的問題Excel
- 讀書筆記-高階owi與oracle效能調整-cache buffer筆記Oracle
- Commit和dbwr沒有任何關係、物理讀產生邏輯讀、快照過舊的理解MIT
- 簡單易懂的雙向資料繫結解讀