在我們最佳化oracle的時候,經常會用到各種各樣的技術手段,其中使用statspack和explain plan是最常見的了。
當我們使用這兩個常見的工具來進行最佳化調整的時候,經常會看到physical reads和logical reads。 那麼這兩者
是什麼東東, 他們分別表示什麼意思,他們有什麼樣的區別叻。
讓我們先做一下這樣的實驗,一起來看看
SQL>set autotr traceonly;
SQL> select * from test1.t_1;
已選擇6行。
引用:
執行計畫
----------------------------------------------------------
Plan hash value: 1376489960
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 234 | 3 (0)| 00:00:01
| 1 | TABLE ACCESS FULL| T_1 | 6 | 234 | 3 (0)| 00:00:01
-------------------------------------------------------------------------
統計資訊
----------------------------------------------------------
199 recursive calls
0 db block gets
38 consistent gets
7 physical reads
0 redo size
961 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
6 rows processed
這裡有個很明顯的
7 physical reads
我們再來執行以下相同的語句
SQL> select * from test1.t_1;
已選擇6行。
引用:
執行計畫
----------------------------------------------------------
Plan hash value: 1376489960
------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti
------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 234 | 3 (0)| 00
| 1 | TABLE ACCESS FULL| T_1 | 6 | 234 | 3 (0)| 00
------------------------------------------------------------------
統計資訊
----------------------------------------------------------
0 recursive calls
0 db block gets
8 consistent gets
0 physical reads
0 redo size
961 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
6 rows processed
這裡的physical reads已經變化了0 physical reads
沖這裡的執行個體來看,當我們第一次讀取t_1表時,表的資料區塊是第一次被讀取到,讀取以後被oracle的載入到buffer中,也就是緩衝到SGA的buffer cache中,這個過程是從資料庫的物理地址進行讀取,讀取後載入到記憶體中,從而這個過程就是我理解的物理讀,這裡為什麼會有7次物理讀,而不是6次,不是16次,這個可以在其他的文章中進行研究,
當第二次我們執行語句的時候,不需要去進行物理山的讀了,在buffer中已經緩衝了這塊資料,我們當然就沒有必要去讀物理磁碟了,從效能上來說,這是很耗時的。 所以直接從buffer裡讀就可以了, 既然是從buffer裡讀,我們就不是一個真實的讀了,所以叫做邏輯讀。這裡就有要引入一個其他的概念,cr(consistent gets),buffer又可能被修改了,或者是因為事務的原因,需要保證讀的一致性,這樣就需要cr了。cr詳細在其他的文章介紹。
寫到這裡,帶小孩去玩去了,回來接著寫。