oracle物理讀和邏輯讀

來源:互聯網
上載者:User

 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

這上面只是簡單的邏輯讀和物理讀。如果能聯絡表的block分布及HWM來看應該會明了一些。 
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.