本文探討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緩沖池。