oracle 內存三 data buffer

Data Buffer是什麼

Data Buffer是oracle的數據緩存。位於SGA中。當Oracle從硬盤上讀取了一段應用數據後,會把這段數據存在Data Buffer中。因爲Oracle認爲如果一個數據被使用過,那麼下次使用它的可能性會很大,所以放在緩存中,下次就可以直接從緩存中提取,不必去從硬盤中提取,因爲計算機對內存的訪問速度遠遠高於硬盤。Oracle在讀取一個數據的時候默認的順序也是先查找Data Buffer,如果找不到纔去硬盤中查找。這個過程中,如果找到了就叫buffer cache hit 。 Oracle術語中DCHR就是指 buffer cache hit ratio。 這個值越高,說明相對的性能越好。


Data Buffer的種類

初學者可能認爲數據庫中只有一個 Data Buffer,但其實不是這樣的。 oracle中至少應該有7種data buffer。這從下面的命令可以看出來

SQL> show parameter cacheNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_16k_cache_size big integer 0db_2k_cache_size big integer 0db_32k_cache_size big integer 0db_4k_cache_size big integer 0db_8k_cache_size big integer 0db_cache_advice string ONdb_cache_size big integer 0db_keep_cache_size big integer 0db_recycle_cache_size big integer 0object_cache_max_size_percent integer 10object_cache_optimal_size integer 102400session_cached_cursors integer 20
其中db_nk_cache_size這一部分,n的值有2,4,8,16,32 一共5種,對應的也就應該有5種data buffer。同時db_cache_size,   db_keep_cache_size,  db_recycle_cache_size這裏又有3個data buffer。但是其實 db_cache_size所對應的data buffer和 前面提到的5個nk  buffer中的某一個data buffer是同一個。所以我們一共有7種 data buffer。不過對於大多數oracle 數據庫,雖然可以存在7種 data buffer,但通常情況下只會設置一個 data buffer. 下面可以一一觀察一下這幾種data buffer。  


db_nk_cache_size

在Oracle中,可以存在五種不同的數據塊尺寸。這些尺寸是2K,4K,8K,16K,32K。其中,system表空間所使用的數據塊尺寸叫做標準塊尺寸。由參數 db_block_size指定。對於非system的表空間,在創建表空間的時候可以指定非標準的數據塊尺寸。當oracle讀取數據的時候,如果讀取的block所在的表空間的塊尺寸爲32K,那麼這個數據讀取之後就只能放到db_32k_cache_size這個參數對應的 data buffer中去。無法放到別的中。 所以如果你創建了一個block  爲nk大小的表空間,那麼你就一定要設置 db_nk_cache_size這個data buffer。

db_cache_size

我們知道Oracle可以存在不同的塊尺寸,但其中有一個默認的標準塊尺寸,也就是system使用的塊尺寸,由db_block_size指定。那麼這裏的db_cache_size就制定了默認的塊尺寸的data buffer的大小。也就是說,它跟前面的 nk中的標準塊尺寸緩存是同一個。 不過要注意的是,這兩個參數只可以設置一個。


db_keep_cache_size

這個參數對應的data buffer的性質是,如果一個數據對象load進了該緩存,就不會被交換出去了。某些時候我們希望一些數據對象永久駐在緩存中,就可以採用這個data buffer。


db_recycle_cache_size

該緩存中的數據被使用完會立即清除


Data Buffer 中的數據塊訪問

這裏主要指默認塊大小的data buffer。data buffer中有兩個鏈表,一個是寫鏈表,一個是空閒鏈表。寫鏈表上的buffer是將要被寫入數據文件的,而空閒鏈表則記錄着可用的Data Buffer。 空閒鏈表採用LRU管理。Oracle訪問過一個數據塊後會把他放在空閒鏈表的MRU端,當需要從硬盤讀數據進入data buffer的時候,則從LRU端分配內存。但是有一個特例要注意,就是全表掃描。

全表掃描時的data buffer

在全表掃描的時候,oracle默認認爲這些讀入的數據不會再次被使用了,所以就把這些數據塊放到空閒鏈表的LRU端。但有的時候,其實我們希望這些數據被再次使用,那麼就希望把這些數據放在MRU端,這樣你需要在創建表的時候指定cache參數。



一些相關的參數和視圖

db_cache_advice  v$db_cache_advice

db_cache_advice有兩個值,on和   off。當爲true的時候,oracle會根據運行的統計信息等爲data buffer的大小做出一些調整建議,建議信息就在 v$db_cache_advice中。

該視圖的列說明:

iddata buffer的ID 1-8。 其中7是db_keep_cache_size 8是db_recycle_cache_size
namedata buffer的名稱
BLOCK_SIZE緩衝池 block size (字節爲單位)
ADVICE_STATUS建議器的狀態,也就是db_cache_advice的狀態。on爲打開,off爲關閉。如果關閉,則數據是上次的
SIZE_FOR_ESTIMATE假設的(預測)cache大小(M 爲單位)
ESTD_PHYSICAL_READ_FACTOR當cache爲SIZE_FOR_ESTIMATE所估算的大小時,物理讀的次數與當前物理讀的比率

在使用這個視圖的時候重點關注ESTD_PHYSICAL_READ_FACTOR 這一項。隨着SIZE_FOR_ESTIMATE的不斷增大,這個值會不斷變化,代表着物理讀越來越小。

我們要找的是哪個變化不再明顯的點。這時候就意味着 data buffer已經足夠大了,已經不在是一個影響物理讀的決定因素了。

關於這個視圖,參見http://www.hellodba.com/reader.php?ID=102&lang=CN


v$buffer_pool

該視圖記錄了數據庫中所有 data buffer的詳細信息。

字段

數據類型

描述

ID

NUMBER

緩衝池ID,和上面視圖描述相同。

NAME

VARCHAR2(20)

緩衝池名稱

BLOCK_SIZE

NUMBER

緩衝池塊尺寸(字節爲單位)

RESIZE_STATE

VARCHAR2(10)

緩衝池當前狀態。

STATIC:沒有被正在調整大小

ALLOCATING:正在分配內存給緩衝池(不能被用戶取消)

ACTIVATING:正在創建新的緩存塊(不能被用戶取消)

SHRINKING:正在刪除緩存塊(能被用戶取消)

CURRENT_SIZE

NUMBER

緩衝池大小(M爲單位)

BUFFERS

NUMBER

當前緩存塊數

TARGET_SIZE

NUMBER

如果正在調整緩衝池大小(即狀態不爲STATIC),這記錄了調整後的大小(M爲單位)。如果狀態爲STATIC,這個值和當前大小值相同。

TARGET_BUFFERS

NUMBER

如果正在調整緩衝池大小(即狀態不爲STATIC),這記錄了調整後的緩存塊數。否則,這個值和當前緩存塊數相同。

PREV_SIZE

NUMBER

前一次調整的緩衝池大小。如果從來沒有調整過,則爲0。

PREV_BUFFERS

NUMBER

前一次調整的緩存塊數。如果從來沒有調整過,則爲0。


v$buffer_pool_statistics

該視圖記錄了各個data buffer的統計信息,於上面視圖的不同就是該視圖主要會包含一些 read次數等信息,而上一個視圖主要是 data buffer的大小。

v$bh

該視圖記錄了數據對象在data buffer中的信息,精細到數據塊級

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章