oracle 物理讀,邏輯讀的理解

來源:互聯網
上載者:User

 

1.物理讀(physical read)

當資料區塊第一次讀取到,就會緩衝到buffer cache 中,而第二次讀取和修改該資料區塊時就在記憶體buffer cache 了 以下是例子:

1.1  第一次讀取:

C:"Documents and Settings"Paul Yi>sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Thu Feb 28 09:32:04 2008 

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> set autotrace traceonly
SQL> select * from test;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)

 

Statistics
----------------------------------------------------------
        175  recursive calls
          0  db block gets
         24  consistent gets
         9  physical reads             --9個物理讀
          0  redo size
        373  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
          1  rows processed

1.2  第二次讀取

SQL> select * from test;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)

 

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets
          0  physical reads     --沒有發生物理讀了,直接從buffer cache 中讀取了
          0  redo size
        373  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

1.3  資料區塊被重新讀入buffer cache ,這種發生在

如果有新的資料需要被讀入Buffer Cache中,而Buffer Cache又沒有足夠的空閑空間,Oracle就根據LRU演算法將LRU鏈表中LRU端的資料置換出去。當這些資料被再次訪問到時,需要重新從磁碟讀入。

SQL> alter session set events 'immediate trace name flush_cache';--清空資料緩衝區

Session altered.

SQL> select * from test;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)

 

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets
          6  physical reads   --又重新發生了物理讀
          0  redo size
        373  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

2.邏輯讀(buffer read)

邏輯讀指的就是從(或者視圖從)Buffer Cache中讀取資料區塊。按照訪問資料區塊的模式不同,可以分為即時讀(Current Read)和一致性讀(Consistent Read)。注意:邏輯IO只有邏輯讀,沒有邏輯寫。

  • 即時讀

即時讀即讀取資料區塊當前的最新資料。任何時候在Buffer Cache中都只有一份當前資料區塊。即時讀通常發生在對資料進行修改、刪除操作時。這時,進程會給資料加上行級鎖,並且標識資料為“髒”資料。

SQL> select * from test for update;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
   1    0   FOR UPDATE
   2    1     TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)

 

Statistics
----------------------------------------------------------
          0  recursive calls
         1  db block gets
         14  consistent gets
          0  physical reads
        252  redo size
        386  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

  • 一致性讀

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

下面這個例子協助大家理解一下一致性讀:

會話1中:

SQL> select * from test;

        ID
        ----------
          1000

SQL> update test set id=2000;

1 row updated.

會話2中:

SQL> set autotrace on
   SQL> select * from test;

        ID
       ----------
          1000

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)

 

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         9  consistent gets    沒有事物做update時 是 7 consistent gets 說明多了2個  consistent gets    這2個是要從復原段中擷取的     
          0  physical reads
         52  redo size
        373  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.