調節Oracle資料緩衝區引數,緩衝整個資料庫(轉)

post0發表於2007-08-14
調節Oracle資料緩衝區引數,緩衝整個資料庫(轉)[@more@]

  在本篇Oracle高階教程裡,我會探討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 xxx;這樣的命令,因為資料庫裡所有表格都會起作用。這就確保所有的資料塊都被緩衝,從而大幅提高讀取操作的效能。但是,寫操作仍然會需要磁碟I/O。由於記憶體條的價格在持續下跌,現在只需要較小的或者不需要硬體投資就能夠透過完全緩衝一個較小的資料庫從而顯著地提高效能。

  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-957176/,如需轉載,請註明出處,否則將追究法律責任。

相關文章