cuug 資料緩衝區調優

murkey發表於2014-01-09

http://bbs.cuug.com/forum.php?mod=viewthread&tid=1336&extra=page%3D1

緩衝區分為
預設池
回收池
保留池
其他非預設塊大小池


緩衝區中塊的狀態:
pending:未決,該記憶體塊處於正在修改或者訪問當中。
dirty:已經被修改過的記憶體塊
free:髒塊被寫入資料檔案後,就被標識為可用(空閒)

檢查點:階段性的儲存修改過的資料塊

DBWn:寫入條件
1、儲存
2、釋放

檢查點發生
沒有空閒
達到閥值
超時
RAC PING request
表空間 offline read only
表 drop和truncate
表空間begin backup


你想,有表T,有塊b1、b2、b3……b100,其中,假設b2在Buffer Cache是個髒塊。
現在表T被刪掉了,b1、b2直到b100,這100個塊的空間被釋放,假設這100個塊的空間又被分配給了表M。現在塊b1、b2、b3……b100屬於表M。
過一會兒,DBWR被觸發,將原來表T的髒塊b2寫到磁碟,注意,塊b2已經是表M了。這將覆蓋表M在b2中的資料。
如何避免這種情況呢,Drop表前先將表所有髒塊寫磁碟,避免以後DBWR再寫它的髒塊

使用多個緩衝區

keep:將經常訪問的資料放在keep池中
recycle:當事務結束時,將涉及的資料塊從池中剔除
       主要的目的是減少對預設池的影響
查詢
select table_name,buffer_pool from user_tables

alter table dept storage(buffer_pool keep);

各個緩衝區的特點
? KEEP Pool
– 快取的資料塊能被重複訪問.
– 表的大小是預設池的10%.
? RECYCLE Pool
– 回收池的資料塊不能被當前事務之外其它
事務訪問.
– 表的大小至少是預設池的2倍


資料緩衝區涉及的資料字典
SQL> SELECT *
2 FROM v$buffer_pool;
ID NAME LO_SETID HI_SETID SET_COUNT BUFFERS LO_BNUM HI_BNUM
-- ------- -------- -------- --------- ------- ------- -------
1 KEEP 3 3 1 14000 0 13999
2 RECYCLE 4 6 3 2000 14000 15999
3 DEFAULT 1 2 2

其它關於資料緩衝區檢視
From V$SYSSTAT:


select name,value
2 FROM v$sysstat
3 WHERE name = 'free buffer inspected';
NAME VALUE
--------------------------- --------
free buffer inspected 183

From V$SYSTEM_EVENT:

SQL> SELECT event, total_waits
2 FROM v$system_event
3 WHERE event in
4 ('free buffer waits', 'buffer busy waits');
EVENT TOTAL_WAITS
---------------------- -----------
free buffer waits 337
buffer busy waits 3466

 

free buffer inspected:表示oracle在釋放緩衝區,在LRU列表中掃描過多少個資料塊,才找到free

buffer busy waits--熱快

1.塊屬於段頭(segment header):因為多個併發insert造成的
解決辦法
1.使用多個freelist列表
2.使用自動段管理方式(利用bitmap管理)

2、如果塊屬於回滾段頭,太多的事物使用同一個回滾段
  解決方法:
    1、儘量少的事物使用同一個回滾段

3、普通的資料塊(存放資料行或者索引行的)多個程式訪問同一個塊中的行資料
  解決方案:
   1、使用尺寸小的資料塊
   2、把pctfree的設定大一些

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

相關文章