oracle 物理讀 邏輯讀的理解
邏輯讀是指從記憶體中讀,物理讀是指從磁碟上讀取資料;如果記憶體中存在相應的讀取資料,那麼直接從記憶體中讀取,邏輯讀的次數加1,如果不存在,則從磁碟上讀到記憶體中,再從記憶體中讀取,邏輯度次數加1,物理讀次數也加1。需要注意的是,物理讀非常消耗系統資源,一個物理讀需要消耗8ms,而一秒可以處理20萬個邏輯讀。
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個一致讀,多了2個一致讀,這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>
3、其他
db block gets
Number of times a CURRENT block was requested.
請求的資料塊在buffer能滿足的個數
consistent gets
Number of times a consistent read was requested for a block.
資料請求在回滾段Buffer中的總數
physical reads
Total number of data blocks read from disk. This number equals the value of "physical reads direct" plus all reads into buffer cache.
所有從磁碟讀取的資料塊數量,即從磁碟讀到Buffer cache資料塊的數量加上直接物理讀
物理讀是由於在DB_BLOCK_BUFFER中沒有找到需要的資料,需要進行緩衝區的資料置換,物理讀操作是非常消耗系統資源的,應當儘量避免。
一致讀是由於需要讀取的資料已經被鎖定或修改,需要從回滾段的緩衝區中讀取,一致讀保證了資料一致性,但是大量的一致讀說明系統設計或記憶體配置出現了問題,也是需要特別注意的。
DB Block Gets是指使用者請求而且又恰好在DB_BLOCK_BUFFER中的資料量,對於一個良好的系統,絕大部分都就應當是這種情況。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1246569/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 物理讀,邏輯讀的理解Oracle
- Oracle物理讀和邏輯讀Oracle
- 有關oracle邏輯讀和物理讀Oracle
- 在Oracle中,什麼是物理讀和邏輯讀?Oracle
- ORACLE 物理讀 邏輯讀 一致性讀 當前模式讀總結淺析Oracle模式
- 硬解析物理讀VS軟解析邏輯讀 測試
- oracle邏輯讀過程Oracle
- Oracle邏輯讀詳解Oracle
- Commit和dbwr沒有任何關係、物理讀產生邏輯讀、快照過舊的理解MIT
- 硬解析和物理讀取與軟解析和邏輯讀取
- 深入瞭解ORACLE的邏輯讀Oracle
- 什麼是oracle 邏輯讀?Oracle
- buffer cache實驗9-從buffer caceh中讀取資料塊解析-從邏輯讀到物理讀
- Oracle上的邏輯壞塊和物理壞塊Oracle
- 【SQL 優化】異常的邏輯讀SQL優化
- sql生成可讀性邏輯圖SQL
- ORACLE10G 物理standby轉為邏輯standbyOracle
- oracle邏輯儲存結構理解Oracle
- 下一代人工智慧:邏輯理解?物理理解?人工智慧
- INDEX RANGE SCAN DESCENDING的邏輯讀問題Index
- 大量邏輯讀的瓶頸分析和優化優化
- 資料讀取之邏輯讀簡單解析--關於BUFFER CACHE
- oracle 邏輯物件與物理物件對應關係圖Oracle物件
- 物理standby和邏輯standby的區別
- Oracle資料庫塊的物理損壞與邏輯損壞Oracle資料庫
- 邏輯和物理計劃如何工作時讀蜂巢分割槽表在獸人pyspark dataframe嗎Spark
- ORACLE SQL調優之統計資訊缺失導致的邏輯讀暴增OracleSQL
- 從邏輯解偶到物理解耦再到前後端分離解耦後端
- 配置物理備庫+邏輯備庫
- 邏輯架構和物理架構架構
- Oracle裡邏輯備份、物理備份、Rman備份的區別Oracle
- 一張圖看懂Oracle邏輯結構和物理結構的關係Oracle
- MySQL調優篇 | 邏輯架構解讀(1)MySql架構
- DELETE資料導致INSERT邏輯讀增加delete
- 配置 Oracle 10g 單例項物理dataguard和邏輯standbyOracle 10g單例
- 物理DG與邏輯DG的區別與邏輯DG同步異常處理方法
- 【AIX 命令學習】lslv 顯示邏輯卷所跨越的物理卷及邏輯卷在物理捲上的分佈!AI
- 理解ProcessFunction的Timer邏輯Function