本文探討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 touchesFROM x$bhWHERE tch > 10ORDER BY tch desc;
這項進階查詢技術在用於追蹤DEFAULT緩衝池裡的對象時尤其有用。一旦定位了熱資料區塊,你就能夠把它們從DEFAULT緩衝池移動到KEEP緩衝池。