什麼是oracle 邏輯讀?
邏輯讀的兩種狀態
邏輯讀指的就是從(或者檢視從)Buffer Cache中讀取資料塊。按照訪問資料塊的模式不同,可以分為即時讀(Current Read)和一致性讀(Consistent Read)。注意:邏輯IO只有邏輯讀,沒有邏輯寫。
即時讀
即時讀即讀取資料塊當前的最新資料。任何時候在Buffer Cache中都只有一份當前資料塊。即時讀通常發生在對資料進行修改、刪除操作時。這時,程式會給資料加上行級鎖,並且標識資料為“髒”資料。
更新時
18:47:05 scott@orcl> update t5 set empno=100;
14 rows updated.
Elapsed: 00:00:00.02
Execution Plan
----------------------------------------------------------
Plan hash value: 1358422326
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 14 | 182 | 3 (0)| 00:00:01 |
| 1 | UPDATE | T5 | | | | |
| 2 | TABLE ACCESS FULL| T5 | 14 | 182 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
6 recursive calls
13 db block gets
12 consistent gets
1 physical reads
3684 redo size
1130 bytes sent via SQL*Net to client
1268 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
14 rows processed
select for update時
18:49:39 scott@orcl> select * from t5 for update;
14 rows selected.
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 10100657
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 |
| 1 | FOR UPDATE | | | | | |
| 2 | BUFFER SORT | | | | | |
| 3 | TABLE ACCESS FULL| T5 | 14 | 1218 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
4 recursive calls
14 db block gets
7 consistent gets
0 physical reads
2956 redo size
2317 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
14 rows processed
一致性讀
Oracle是一個多使用者系統。當一個會話開始讀取資料還未結束讀取之前,可能會有其他會話修改它將要讀取的資料。如果會話讀取到修改後的資料,就會造成資料的不一致。一致性讀就是為了保證資料的一致性。在Buffer Cache中的資料塊上都會有最後一次修改資料塊時的SCN。如果一個事務需要修改資料塊中資料,會先在回滾段中儲存一份修改前資料和SCN的資料塊,然後再更新Buffer Cache中的資料塊的資料及其SCN,並標識其為“髒”資料。當其他程式讀取資料塊時,會先比較資料塊上的SCN和自己的SCN。如果資料塊上的SCN小於等於程式本身的SCN,則直接讀取資料塊上的資料;如果資料塊上的SCN大於程式本身的SCN,則會從回滾段中找出修改前的資料塊讀取資料。通常,普通查詢都是一致性讀。
在會話1
18:48:37 sys@orcl> select * from scott.t5;
14 rows selected.
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 2002323537
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T5 | 14 | 1218 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
19 consistent gets
0 physical reads
108 redo size
1630 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
我們可以看到有19個一致性讀
此時如果我們如果在另外一個回話中更改表中的資料
18:50:32 scott@orcl> update t5 set empno=200;
14 rows updated.
Elapsed: 00:00:00.02
Execution Plan
----------------------------------------------------------
Plan hash value: 1358422326
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 14 | 182 | 3 (0)| 00:00:01 |
| 1 | UPDATE | T5 | | | | |
| 2 | TABLE ACCESS FULL| T5 | 14 | 182 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
4 recursive calls
13 db block gets
7 consistent gets
0 physical reads
3684 redo size
1131 bytes sent via SQL*Net to client
1268 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
14 rows processed
再次我們在會話一中做查詢
19:17:35 sys@orcl> /
14 rows selected.
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 2002323537
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T5 | 14 | 1218 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
33 consistent gets
0 physical reads
108 redo size
1630 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
我們可以看到 此時一致性讀變成了33個,我們就可以知道此時我們多從undo段中去找資料了
我們都知道,資料塊是oracle最基本的讀寫單位,但使用者所需要的資料,並不是整個塊,而是塊中的行,或列.當使用者發出SQL語句時,此語句被解析執行完畢,就開始了資料的抓取階段,在此階段,伺服器程式會先將行所在的資料塊從資料檔案中讀入buffer cache,這個過程叫做物理讀.物理讀,每讀取一個塊,就算一次物理讀.當塊被送進buffer cache後,並不能立即將塊傳給使用者,因為使用者所需要的並不是整個塊,而是塊中的行.從buffer cache的塊中讀取行的過程,就是邏輯讀.為了完成一次邏輯讀,伺服器程式先要在hash表中查詢塊所在的buffer cache 鏈.找到之後,需要在這個鏈上加一個cache buffer chains 閂,加閂成功之後,就在這個鏈中尋找指定的塊,並在塊上加一個pin鎖.並釋放cache buffer chains閂.然後就可以訪問塊中的行了.伺服器程式不會將塊中所有滿足條件的行一次取出,而是根據你的抓取命令,每次取一定數量的行.這些行取出之後,會經由PGA傳給客戶端使用者.行一旦從buffer cache中取出,會話要釋放掉在塊上所加的PIN.本次邏輯讀就算結束.如果還要再抓取塊中剩餘的行,伺服器程式要再次申請獲得cache bufffer鏈閂.再次在塊上加PIN.這就算是另外一次邏輯讀咯.也就是說,伺服器程式每申請一次cache buffer鏈閂,就是一次邏輯讀.而每次邏輯讀所讀取的行的數量,可以在抓取命令中進行設定.
邏輯讀和Cache buffer chains閂關係密切,TOM曾有文章提到,程式每申請一次Cache buffer chains閂,就是一次邏輯讀。但是,邏輯讀並不等同於Cache buffer chains閂,每次邏輯讀,在9i中至少需要獲得兩Cache buffer chains閂。邏輯讀是指在Hash表中定位塊的這個過程。
邏輯讀指的就是從(或者檢視從)Buffer Cache中讀取資料塊。按照訪問資料塊的模式不同,可以分為即時讀(Current Read)和一致性讀(Consistent Read)。注意:邏輯IO只有邏輯讀,沒有邏輯寫。
即時讀
即時讀即讀取資料塊當前的最新資料。任何時候在Buffer Cache中都只有一份當前資料塊。即時讀通常發生在對資料進行修改、刪除操作時。這時,程式會給資料加上行級鎖,並且標識資料為“髒”資料。
更新時
18:47:05 scott@orcl> update t5 set empno=100;
14 rows updated.
Elapsed: 00:00:00.02
Execution Plan
----------------------------------------------------------
Plan hash value: 1358422326
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 14 | 182 | 3 (0)| 00:00:01 |
| 1 | UPDATE | T5 | | | | |
| 2 | TABLE ACCESS FULL| T5 | 14 | 182 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
6 recursive calls
13 db block gets
12 consistent gets
1 physical reads
3684 redo size
1130 bytes sent via SQL*Net to client
1268 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
14 rows processed
select for update時
18:49:39 scott@orcl> select * from t5 for update;
14 rows selected.
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 10100657
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 |
| 1 | FOR UPDATE | | | | | |
| 2 | BUFFER SORT | | | | | |
| 3 | TABLE ACCESS FULL| T5 | 14 | 1218 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
4 recursive calls
14 db block gets
7 consistent gets
0 physical reads
2956 redo size
2317 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
14 rows processed
一致性讀
Oracle是一個多使用者系統。當一個會話開始讀取資料還未結束讀取之前,可能會有其他會話修改它將要讀取的資料。如果會話讀取到修改後的資料,就會造成資料的不一致。一致性讀就是為了保證資料的一致性。在Buffer Cache中的資料塊上都會有最後一次修改資料塊時的SCN。如果一個事務需要修改資料塊中資料,會先在回滾段中儲存一份修改前資料和SCN的資料塊,然後再更新Buffer Cache中的資料塊的資料及其SCN,並標識其為“髒”資料。當其他程式讀取資料塊時,會先比較資料塊上的SCN和自己的SCN。如果資料塊上的SCN小於等於程式本身的SCN,則直接讀取資料塊上的資料;如果資料塊上的SCN大於程式本身的SCN,則會從回滾段中找出修改前的資料塊讀取資料。通常,普通查詢都是一致性讀。
在會話1
18:48:37 sys@orcl> select * from scott.t5;
14 rows selected.
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 2002323537
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T5 | 14 | 1218 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
19 consistent gets
0 physical reads
108 redo size
1630 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
我們可以看到有19個一致性讀
此時如果我們如果在另外一個回話中更改表中的資料
18:50:32 scott@orcl> update t5 set empno=200;
14 rows updated.
Elapsed: 00:00:00.02
Execution Plan
----------------------------------------------------------
Plan hash value: 1358422326
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 14 | 182 | 3 (0)| 00:00:01 |
| 1 | UPDATE | T5 | | | | |
| 2 | TABLE ACCESS FULL| T5 | 14 | 182 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
4 recursive calls
13 db block gets
7 consistent gets
0 physical reads
3684 redo size
1131 bytes sent via SQL*Net to client
1268 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
14 rows processed
再次我們在會話一中做查詢
19:17:35 sys@orcl> /
14 rows selected.
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 2002323537
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| T5 | 14 | 1218 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
33 consistent gets
0 physical reads
108 redo size
1630 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
我們可以看到 此時一致性讀變成了33個,我們就可以知道此時我們多從undo段中去找資料了
我們都知道,資料塊是oracle最基本的讀寫單位,但使用者所需要的資料,並不是整個塊,而是塊中的行,或列.當使用者發出SQL語句時,此語句被解析執行完畢,就開始了資料的抓取階段,在此階段,伺服器程式會先將行所在的資料塊從資料檔案中讀入buffer cache,這個過程叫做物理讀.物理讀,每讀取一個塊,就算一次物理讀.當塊被送進buffer cache後,並不能立即將塊傳給使用者,因為使用者所需要的並不是整個塊,而是塊中的行.從buffer cache的塊中讀取行的過程,就是邏輯讀.為了完成一次邏輯讀,伺服器程式先要在hash表中查詢塊所在的buffer cache 鏈.找到之後,需要在這個鏈上加一個cache buffer chains 閂,加閂成功之後,就在這個鏈中尋找指定的塊,並在塊上加一個pin鎖.並釋放cache buffer chains閂.然後就可以訪問塊中的行了.伺服器程式不會將塊中所有滿足條件的行一次取出,而是根據你的抓取命令,每次取一定數量的行.這些行取出之後,會經由PGA傳給客戶端使用者.行一旦從buffer cache中取出,會話要釋放掉在塊上所加的PIN.本次邏輯讀就算結束.如果還要再抓取塊中剩餘的行,伺服器程式要再次申請獲得cache bufffer鏈閂.再次在塊上加PIN.這就算是另外一次邏輯讀咯.也就是說,伺服器程式每申請一次cache buffer鏈閂,就是一次邏輯讀.而每次邏輯讀所讀取的行的數量,可以在抓取命令中進行設定.
邏輯讀和Cache buffer chains閂關係密切,TOM曾有文章提到,程式每申請一次Cache buffer chains閂,就是一次邏輯讀。但是,邏輯讀並不等同於Cache buffer chains閂,每次邏輯讀,在9i中至少需要獲得兩Cache buffer chains閂。邏輯讀是指在Hash表中定位塊的這個過程。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2124994/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在Oracle中,什麼是物理讀和邏輯讀?Oracle
- 01-什麼是邏輯?
- java短路邏輯運算子是什麼Java
- 幽默:什麼是業務邏輯程式碼?
- Oracle物理讀和邏輯讀Oracle
- oracle邏輯讀過程Oracle
- Oracle邏輯讀詳解Oracle
- oracle 物理讀 邏輯讀的理解Oracle
- oracle 物理讀,邏輯讀的理解Oracle
- 有關oracle邏輯讀和物理讀Oracle
- 網際網路賺錢的邏輯是什麼?
- 深入瞭解ORACLE的邏輯讀Oracle
- 谷歌炒作人工智慧的邏輯形式是什麼?谷歌人工智慧
- 為什麼說spring是負責業務邏輯的Spring
- 02-邏輯學有什麼用?
- 零程式碼整合自動化的實現邏輯是什麼?
- 什麼是硬碟邏輯損壞和檔案系統錯誤硬碟
- 直播賣貨系統的流量邏輯及運營方式是什麼?
- 一文分析:軟體測試的底層邏輯是什麼?
- oracle 邏輯結構Oracle
- 什麼是LVM邏輯卷管理?0基礎學Linux運維LVMLinux運維
- 老遊戲試水新直播,征途這波操作的背後邏輯是什麼?遊戲
- InnoDB的邏輯儲存結構是什麼,表空間組成包括哪些?
- 我們廣泛談論的小程式,其產生的邏輯是什麼?
- oracle的邏輯結構Oracle
- 邏輯備用資料庫主要作用是什麼。資料庫
- ORACLE 物理讀 邏輯讀 一致性讀 當前模式讀總結淺析Oracle模式
- 什麼是ORACLE AMEOracle
- 什麼是Oracle RACOracle
- 深度 | 帶領國產資料庫走向世界,POLARDB底層邏輯是什麼?資料庫
- sql生成可讀性邏輯圖SQL
- CORBA的讀音是什麼?ORB
- Oracle OCP(41):邏輯結構Oracle
- Oracle 邏輯備份 expdp/impdpOracle
- Oracle 11.1 邏輯壞塊Oracle
- Oracle邏輯備份指令碼Oracle指令碼
- [zt] Oracle的邏輯結構Oracle
- Oracle 邏輯結構簡介Oracle