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 cache
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
db_16k_cache_size big integer 0
-
db_2k_cache_size big integer 0
-
db_32k_cache_size big integer 0
-
db_4k_cache_size big integer 0
-
db_8k_cache_size big integer 0
-
db_cache_advice string ON
-
db_cache_size big integer 0
-
db_keep_cache_size big integer 0
-
db_recycle_cache_size big integer 0
-
object_cache_max_size_percent integer 10
-
object_cache_optimal_size integer 102400
- session_cached_cursors integer 20
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中。
該檢視的列說明:
id | data buffer的ID 1-8。 其中7是db_keep_cache_size 8是db_recycle_cache_size |
name | data 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已經足夠大了,已經不在是一個影響物理讀的決定因素了。
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中的資訊,精細到資料塊級別.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27785870/viewspace-2123164/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle10g data buffer cache的記憶體結構Oracle記憶體
- data buffer cache的一點總結。
- tf.data.Dataset.shuffle(buffer_size)中buffer_size的理解
- data buffer cache的一點總結 -- 轉
- Oracle Buffer Cache原理Oracle
- Oracle database buffer cacheOracleDatabase
- 【BUFFER】Oracle buffer cache之 latch 學習記錄Oracle
- Oracle Cache Buffer ChainsOracleAI
- Oracle Free Buffer WaitsOracleAI
- Oracle Buffer Busy WaitsOracleAI
- Oracle buffer狀態深入剖析Oracle
- [Oracle Script] Buffer Cache Hit RatioOracle
- oracle data guard!!Oracle
- oracle data pumpOracle
- 物件有多少個資料塊緩衝在Data buffer中物件
- Oracle Buffer Cache原理總結(一)Oracle
- Oracle Buffer Cache原理總結(二)Oracle
- Oracle Flashback Data ArchiveOracleHive
- Oracle Data Guard配置Oracle
- oracle buffer cache管理機制_buffer cache dump與lru機制小記Oracle
- Oracle中flush buffer cache和x$bhOracle
- 介紹ORACLE DATA GUARD——DATA GUARD概念和管理Oracle
- Oracle Data Guard Broker元件Oracle元件
- Oracle Data Guard簡介Oracle
- Oracle Data Provider for .NETOracleIDE
- Oracle Data Guard 介紹Oracle
- Oracle Data Integrator 介紹...Oracle
- Oracle Data Pump 研究(一)Oracle
- ORACLE Data Guard--IOracle
- Unload data from oracleOracle
- Oracle data link建立Oracle
- 4.1.6 Oracle Restart 與 Oracle Data Guard 整合OracleREST
- oracle buffer busy waits等待的含義OracleAI
- Oracle 11g buffer cache的設定Oracle
- Oracle中Buffer Cache記憶體結構Oracle記憶體
- [20210104]單例項data buffer states 2.txt單例
- 從Data Buffer中讀資料是單塊讀,還是多塊讀?
- 1 關於 Oracle Data GuardOracle