Oracle資料庫緩衝區工作原理

2021-08-28 02:53:39 字數 2451 閱讀 9290

本文**oracle資料緩衝區的內部機制——oracle用這一記憶體來防止不必要的資料塊從磁碟重讀。理解oracle資料緩衝區如何操作,是成功地運用它們調整資料庫效能的關鍵。 

在oracle 8i以前的版本裡,當資料塊被從磁碟送進資料緩衝區的時候,資料塊會被自動地放置到最近使用過的資料列表的前部。但是,這種行為從oracle 8i開始就變了:新資料緩衝區被放置在緩衝區鏈的中部。在調節資料庫的時候,你的目標就是為資料緩衝區分配盡量多的記憶體,而不會導致資料庫伺服器在記憶體裡分頁。資料緩衝區每小時的命中率一旦低於90%,你就應該為資料塊緩衝區增加緩衝區。 

資料塊的存活時間 

在調入資料塊之後,oracle會不停地跟蹤資料塊的使用計數(touch count,也就是說,這個資料塊被使用者執行緒所訪問的次數)。如果乙個資料塊被多次使用,它就被移動到最近使用過的資料列表的最前面,這樣就能確保它會在記憶體裡儲存一段較長的時間。這種新的中點插入技術會確保最常使用的資料塊被保留在最近使用過的資料列表的最前面,因為新的資料塊只有在它們被重複使用的時候才會被移動到緩衝區鏈的最前面。 

總而言之,oracle 8i資料緩衝池的管理要比先前的版本更加有效。通過將新的資料塊插入緩衝區的中部,並根據訪問活動(頻率)調整緩衝區鏈,每個資料緩衝區就被分割成兩個部分:熱區(hot section),代表資料緩衝區的最近使用的一半;冷區(cold section),代表資料緩衝區的最早使用的一半。只有那些被反覆請求的資料塊才會被移進每個緩衝池的熱區,這就讓每個資料緩衝區在緩衝常用資料塊的時候效率更高。 

熱區的大小要用下面的隱藏引數來配置: 

_db_percent_hot_default 

_db_percent_hot_keep 

_db_percent_hot_recycle

oracle公司作為官方沒有推薦更改這些隱藏引數。只有懂得內部機制和希望調節其資料緩衝區行為的有經驗人員才應該使用這些引數。 

找到熱資料塊 

oracle 8i保留著乙個x$bh內部檢視表,用來顯示資料緩衝池的相對效能。x$bh檢視表有下列資料列: 

tim:兩次使用之間的時間差,和_db_aging_touch_time引數相關。 

tch:使用計數,它和被使用過_db_aging_hot_criteria次之後從冷區移入熱區直接相關。 

由於tch資料列用來追蹤特定資料塊的使用次數,所以你就能夠編寫乙個字典查詢來顯示緩衝區裡的熱資料塊——使用計數大於10的資料塊,就像下面這樣: 

select

obj      object,

dbarfil  file#,

dbablk   block#,

tch      touches

from

x$bh

where

tch > 10

order by

tch desc;

這項高階查詢技術在用於追蹤default緩衝池裡的物件時尤其有用。一旦定位了熱資料塊,你就能夠把它們從default緩衝池移動到keep緩衝池。 

完全緩衝資料庫 

從oracle 8i開始,隨著64位定址的出現,你就能夠建立乙個完全在資料緩衝區裡緩衝的資料庫。現今,任何資料庫通常只用不到20g的記憶體就能夠被完全緩衝,而更大的資料庫仍然需要部分資料緩衝區。 

要利用完全資料緩衝的優勢,就要記住從記憶體取回資料塊和從磁碟取回資料塊的時間差。對磁碟的訪問時間是以毫秒或者說千分之一秒來計算的,而記憶體的速度是以納秒或者說十億分之一秒來計算的。因此記憶體的訪問速度要快三個數量級,即通常要比磁碟的訪問速度塊將近14,000倍。 

在完全緩衝oracle資料庫的時候,你需要仔細制定緩衝的規劃,並在需要的時候增加db_block_ buffers引數的值。在緩衝整個資料庫的時候,多資料緩衝池就不再需要了,所以你可以在default資料池裡緩衝所有的資料塊。 

如果要計算已分配資料塊的數量,就要用下面的命令: 

select

sum(blocks)

from

dba_data_files;

sum(blocks)

-----------

243260

select

sum(blocks)

from

dba_extents;

sum(blocks)

-----------

321723

已使用資料塊的真實數量要通過檢視dbms_rowid以獲得真實的資料庫位址來確定,就像下面這樣: 

select

sum(blocks)

from

dba_data_files;

隨著資料庫的擴充套件,你必須不忘增加引數的值。在資料庫的啟動階段,你需要呼叫乙個指令碼載入緩衝區,這一步很簡單,就像執行select count(*) from ***;這樣的命令,因為資料庫裡所有**都會起作用。這就確保所有的資料塊都被緩衝,從而大幅提高讀取操作的效能。但是,寫操作仍然會需要磁碟i/o。由於記憶體條的**在持續**,現在只需要較小的或者不需要硬體投資就能夠通過完全緩衝乙個較小的資料庫從而顯著地提高效能。

Oracle 資料庫緩衝區命中率

oracle 資料庫緩衝區命中率 作業系統 hp ux 和 aix 資料庫版本 10.2.0.5.0 sql select value from v sysstat where name physical reads sql select value from v sysstat where nam...

ORACLE資料緩衝區DB cache

oracle資料緩衝區db cache db cache是以資料塊為單位組織的緩衝區,資料庫剛剛啟動的時候,db cache中幾乎沒有使用者資料的緩衝,當會話訪問資料庫中的表或索引時,首先會檢查db cache中是否存在該資料,如果不存在,就會從資料檔案中讀取該資料塊到db cache中,然後再從d...

2 2 資料庫高速緩衝區

您所在的位置 讀書頻道 資料庫 oracle 2.2 資料庫高速緩衝區 2012 05 10 21 38 張天慧 清華大學出版社 字型大小 t t 綜合評級 oracle管理之道 第2章oracle例項,本章重點在於深入解析oracle本身執行時的記憶體空間,也就是oracle的例項主體,但誠如本章...