BKJIA資料庫頻道向您推薦《Oracle資料庫調試與效能最佳化》專題,以便於您更好的理解本文。
Oracle效能最佳化基本方法包括一下幾個步驟,包括:
1)設立合理的Oracle效能最佳化目標。
2)測量並記錄當前的Oracle效能。
3)確定當前Oracle效能瓶頸Oracle等待什麼、哪些SQL語句是該等待事件的成分)。
4)把等待事件記入追蹤檔案。
5)確定當前的OS瓶頸。
6)最佳化所需的成分應用程式、資料庫、I/O、爭用、OS等)。
7)跟蹤並實施更改控制過程。
8)測量並記錄當前效能
9)重複步驟3到7,直到滿足最佳化目標
下面來一一詳述。
1.設立合理的Oracle效能最佳化目標
重點:關於設立目標的最重要的一點是它們必須是可量化和可達到的。
方法:目標必須是當前效能和所需效能的的陳述形式的語句。
2.測量並記錄當前Oracle效能重點:
1)需要在峰值啟用時間獲得當前系統效能快照
2)關鍵是要在出現效能問題的時間段內採集資訊
3)必須在合理的時間段上採集,一般在峰值期間照幾個為期15分鐘的快照
3.確定當前Oracle效能瓶頸重點:從Oracle 等待介面v$system_event、v$session_event和v$session_wait中獲得等待事件,進而找出影響效能的對象和sql語句。方法如下:
1)首先,利用v$system_event視圖執行下面的查詢查看資料庫中某些常見的等待事件:
- select * from v$system_event
- where event in ('buffer busy waits',
- 'db file sequential read',
- 'db file scattered read',
- 'enqueue',
- 'free buffer waits',
- 'latch free',
- 'log file parallel write',
- 'log file sync');
2)接著,利用下面對v$session_event和v$session視圖進行的查詢,研究具有對上面顯示的內容有貢獻的等待事件的會話:
- select se.sid,s.username,se.event,se.total_waits,se.time_waited,se.average_wait
- from v$session s,v$session_event se
- where s.sid = se.sid
- and se.event not like 'SQL*Net%'
- and s.status = 'ACTIVE'
- and s.username is not null;
3)使用下面查詢找到與所串連的會話有關的當前等待事件。這些資訊是動態,為了查看一個會話的等待最多的事件是什麼,需要多次執行此查詢。
- select sw.sid,s.username,sw.event,sw.wait_time,sw.state,sw.seconds_in_wait SEC_IN_WAIT
- from v$session s,v$session_wait sw
- where s.sid = sw.sid
- and sw.event not like 'SQL*Net%'
- and s.username is not null
- order by sw.wait_time desc;
4)查詢會話等待事件的詳細資料
- select sid,event,p1text,p1,p2text,p2,p3text,p3
- from v$session_wait
- where sid between &1 and &2
- and event not like '%SQL%'
- and event not like '%rdbms%';
5)利用P1、P2的資訊,找出等待事件的相關的段
- select owner,segment_name,segment_type,tablespace_name
- from dba_extents
- where file_id = &fileid_in
- and &blockid_in between block_id and block_id + blocks - 1;
6)獲得操作該段的sql語句:
- select sid, getsqltxt(sql_hash_value,sql_address)
- from v$session
- where sid = &sid_in;
7)getsqltxt函數
8)至此已經找到影響效能的對象和sql語句,可以有針對性地最佳化