Oracle物理讀和邏輯讀
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 有關oracle邏輯讀和物理讀Oracle
- oracle 物理讀 邏輯讀的理解Oracle
- oracle 物理讀,邏輯讀的理解Oracle
- 在Oracle中,什麼是物理讀和邏輯讀?Oracle
- 硬解析和物理讀取與軟解析和邏輯讀取
- ORACLE 物理讀 邏輯讀 一致性讀 當前模式讀總結淺析Oracle模式
- 硬解析物理讀VS軟解析邏輯讀 測試
- oracle邏輯讀過程Oracle
- Oracle邏輯讀詳解Oracle
- 什麼是oracle 邏輯讀?Oracle
- 深入瞭解ORACLE的邏輯讀Oracle
- Commit和dbwr沒有任何關係、物理讀產生邏輯讀、快照過舊的理解MIT
- Oracle上的邏輯壞塊和物理壞塊Oracle
- buffer cache實驗9-從buffer caceh中讀取資料塊解析-從邏輯讀到物理讀
- 邏輯架構和物理架構架構
- 邏輯和物理計劃如何工作時讀蜂巢分割槽表在獸人pyspark dataframe嗎Spark
- 大量邏輯讀的瓶頸分析和優化優化
- 物理standby和邏輯standby的區別
- 配置 Oracle 10g 單例項物理dataguard和邏輯standbyOracle 10g單例
- sql生成可讀性邏輯圖SQL
- 物理讀和記憶體讀較高SQL記憶體SQL
- ORACLE10G 物理standby轉為邏輯standbyOracle
- 一張圖看懂Oracle邏輯結構和物理結構的關係Oracle
- 【SQL 優化】異常的邏輯讀SQL優化
- 資料讀取之邏輯讀簡單解析--關於BUFFER CACHE
- oracle 邏輯物件與物理物件對應關係圖Oracle物件
- 邏輯 rac standby和物理 rac standby的switchover 和 failoverAI
- 物理結構和邏輯結構更通俗解釋
- shared pool的物理結構和邏輯結構
- 配置物理備庫+邏輯備庫
- MySQL調優篇 | 邏輯架構解讀(1)MySql架構
- DELETE資料導致INSERT邏輯讀增加delete
- INDEX RANGE SCAN DESCENDING的邏輯讀問題Index
- 深度解讀GaussDB邏輯解碼技術原理
- 移動前端適配—邏輯畫素和物理畫素前端
- 【轉】各系統下檢視cpu物理和邏輯個數
- Oracle資料庫塊的物理損壞與邏輯損壞Oracle資料庫
- ORACLE SQL調優之統計資訊缺失導致的邏輯讀暴增OracleSQL