Oracle物理讀和邏輯讀

kunlunzhiying發表於2016-03-29

oracle的邏輯讀和物理讀 
1.物理讀即是把資料從磁碟讀入到buffer catch的過程。 
 通常情況下是,如果需要資料的時候發現不存在於buffer catch當中,即oracle就會執行物理讀。 
 例子如下: 
  
   C:/Documents and Settings/Administrator>sqlplus jenny/jenny 
   SQL> set autotrace traceonly; 
   SQL> select * from t_test1; 

    ---------------------------------------------------------- 
    Plan hash value: 1883417357 
    ........... 
    ---------------------------------------------------------- 
          0  recursive calls 
          0  db block gets 
         11  consistent gets 
          3  physical reads --發生了3次物理讀寫 
          0  redo size 
      10632  bytes sent via SQL*Net to client 
        451  bytes received via SQL*Net from client 
          8  SQL*Net roundtrips to/from client 
          0  sorts (memory) 
          0  sorts (disk) 
         97  rows processed 


 SQL> select * from t_test1; 

 ---------------------------------------------------------- 
 Plan hash value: 1883417357 
        ........ 
---------------------------------------------------------- 
          0  recursive calls 
          0  db block gets 
         11  consistent gets 
          0  physical reads --這裡沒有發生物理讀取,因為這時資料已存在buffer catche中 
          0  redo size 
      10632  bytes sent via SQL*Net to client 
        451  bytes received via SQL*Net from client 
          8  SQL*Net roundtrips to/from client 
          0  sorts (memory) 
          0  sorts (disk) 
         97  rows processed 

 如果重新清掉快取,再執行以上查詢語句,又會重新把資料從磁碟讀入資料,即會發生物理讀取 

  SQL> alter session set events 'immediate trace name flush_cache'; 
    SQL> select * from t_test1; 
     ---------------------------------------------------------- 
    Plan hash value: 1883417355 
        ........ 
     ---------------------------------------------------------- 
          0  recursive calls 
          0  db block gets 
         11  consistent gets 
          3  physical reads  --重新發生物理讀取 
          0  redo size 
      10632  bytes sent via SQL*Net to client 
        451  bytes received via SQL*Net from client 
          8  SQL*Net roundtrips to/from client 
          0  sorts (memory) 
          0  sorts (disk) 
         97  rows processed 

2.邏輯讀取 
邏輯讀指的就是從(或者檢視從)Buffer Cache中讀取資料塊。按照訪問資料塊的模式不同,可以分為即時讀(Current Read)和一致性讀(Consistent Read)。  
  
 1)即時讀 
    即時讀即讀取資料塊當前的最新資料。任何時候在Buffer Cache中都只有一份當前資料塊。即時讀通常發生在對資料進行修改、刪除操作時。 
    這時,程式會給資料加上行級鎖,並且標識資料為“髒”資料。 
    SQL> select * from t_test1 for update; 

    ---------------------------------------------------------- 
    Plan hash value: 3323170753 

    ------------------------------------------------------------------------------ 
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     | 
    ------------------------------------------------------------------------------ 
    |   0 | SELECT STATEMENT   |         |    97 |  8536 |     3   (0)| 00:00:01 | 
    |   1 |  FOR UPDATE        |         |       |       |            |          | 
    |   2 |   TABLE ACCESS FULL| T_TEST1 |    97 |  8536 |     3   (0)| 00:00:01 | 
   ---------------------------------------------------------- 
          1  recursive calls 
         99  db block gets  --即時讀取 
         15  consistent gets 
          0  physical reads 
      19608  redo size 
       9123  bytes sent via SQL*Net to client 
        451  bytes received via SQL*Net from client 
          8  SQL*Net roundtrips to/from client 
          0  sorts (memory) 
          0  sorts (disk) 
         97  rows processed 

2)一致性讀 
    Oracle是一個多使用者系統。當一個會話開始讀取資料還未結束讀取之前,可能會有其他會話修改它將要讀取的資料。如果會話讀取到修改後的資料,就會造成資料的不一致。 
    一致性讀就是為了保證資料的一致性。在Buffer Cache中的資料塊上都會有最後一次修改資料塊時的SCN。 
   如果一個事務需要修改資料塊中資料,會先在回滾段中儲存一份修改前資料和SCN的資料塊,然後再更新Buffer Cache中的資料塊的資料及其SCN,並標識其為“髒”資料。 
   當其他程式讀取資料塊時,會先比較資料塊上的SCN和自己的SCN。如果資料塊上的SCN小於等於程式本身的SCN,則直接讀取資料塊上的資料; 
   如果資料塊上的SCN大於程式本身的SCN,則會從回滾段中找出修改前的資料塊讀取資料。通常,普通查詢都是一致性讀。 

  SQL> select * from t_test1 
    ---------------------------------------------------------- 
   Plan hash value: 1883417357 

   ----------------------------------------------------------------------------- 
   | Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     | 
   ----------------------------------------------------------------------------- 
  |   0 | SELECT STATEMENT  |         |    97 |  8536 |     3   (0)| 00:00:01 | 
  |   1 |  TABLE ACCESS FULL| T_TEST1 |    97 |  8536 |     3   (0)| 00:00:01 | 
  ----------------------------------------------------------------------------- 
  ---------------------------------------------------------- 
          1  recursive calls 
          0  db block gets 
         11  consistent gets  --一致性讀取,這是沒有讀取回滾段情況下 
          0  physical reads 
          0  redo size 
      10632  bytes sent via SQL*Net to client 
        451  bytes received via SQL*Net from client 
          8  SQL*Net roundtrips to/from client 
          0  sorts (memory) 
          0  sorts (disk) 
         97  rows processed 

 開啟另一個session執行同一個表的update或者delete並且是在沒有commit的情況下(只有這種情況才會去讀回滾段),再執行sql 

SQL> select * from t_test1; 
---------------------------------------------------------- 
Plan hash value: 1883417357 

----------------------------------------------------------------------------- 
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     | 
----------------------------------------------------------------------------- 
|   0 | SELECT STATEMENT  |         |    97 |  8536 |     3   (0)| 00:00:01 | 
|   1 |  TABLE ACCESS FULL| T_TEST1 |    97 |  8536 |     3   (0)| 00:00:01 | 
----------------------------------------------------------------------------- 
---------------------------------------------------------- 
          0  recursive calls 
          0  db block gets 
         12  consistent gets --需要讀回滾段的資料,所以會增加consistent gets 
          0  physical reads 
          0  redo size 
      10632  bytes sent via SQL*Net to client 
        451  bytes received via SQL*Net from client 
          8  SQL*Net roundtrips to/from client 
          0  sorts (memory) 
          0  sorts (disk) 
         97  rows processed


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28211342/viewspace-2071601/,如需轉載,請註明出處,否則將追究法律責任。

相關文章