Oracle 效能最佳化的基本方法概述
1)設立合理的效能最佳化目標。
2)測量並記錄當前效能。
3)確定當前Oracle效能瓶頸(Oracle等待什麼、哪些SQL語句是該等待事件的成分)。
4)把等待事件記入跟蹤檔案。
5)確定當前的OS瓶頸。
6)最佳化所需的成分(應用程式、資料庫、I/O、爭用、OS等)。
7)跟蹤並實施更改控制過程。
8)測量並記錄當前效能
9)重複步驟3到7,直到滿足最佳化目標
1.設立合理的效能最佳化目標
重點:關於設立目標的最重要的一點是它們必須是可量化和可達到的。
方法:目標必須是當前效能和所需效能的的陳述形式的語句。只需填寫下列語句中的空格即可。
花費了 (時/分/秒),但要求它在 (時/分/秒)內執行。
使用了 (資源量),但它不能使用超過 。
2. 測量並記錄當前效能
重點:
(1)需要在峰值活動時間獲得當前系統效能快照
(2)關鍵是要在出現效能問題的時間段內採集資訊
(3)必須在合理的時間段上採集,一般在峰值期間照幾個為期15分鐘的快照
方法:執行STATSPACK
-- 建立效能快照表空間
sqlplus sys as sysdba
create tablespace perfstat datafile '/u02/oradata/dbnms/perfstat.dbf' size 500M extent management local;
-- 安裝STATSPACK
@$ORACLE_HOME/rdbms/admin/spcreate.sql;
-- 獲取效能資料,可以生成多個快照
sqlplus perfstat
execute statspack.snap;
-- 生成效能快照的報表
sqlplus perfstat
select min(snap_id) snapid_min, max(snap_id) snapid_max from stats$snapshot;
@$ORACLE_HOME/rdbms/admin/spreport;
-- 該報告中有關於效能的重要資訊,如前5位的等待事件、cache大小、各種記憶體結構的命中率、每秒及每事務邏輯、物理讀寫資料塊數、效能最差的sql語句等
3. 確定當前Oracle效能瓶頸
重點:從Oracle 等待介面v$system_event、v$session_event和v$session_wait中獲得等待事件,進而找出影響效能的物件和sql語句
方法:
-- 首先,利用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');
-- 接著,利用下面對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;
-- 使用下面查詢找到與所連線的會話有關的當前等待事件。這些資訊是動態的,為了檢視一個會話的等待最多的事件是什麼,需要多次執行此查詢。
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;
-- 查詢會話等待事件的詳細資訊
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%';
-- 利用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;
-- 獲得操作該段的sql語句:
select sid, getsqltxt(sql_hash_value,sql_address)
from v$session
where sid = &sid_in;
-- getsqltxt函式
create or replace
function GetSQLtxt (hashaddr_in in v$sqltext.hash_value%type,
addr_in in v$sqltext.address%type)
return varchar2
is
temp_sqltxt varchar2(32767);
cursor sqlpiece_cur
is
select piece,sql_text
from v$sqltext
where hash_value = hashaddr_in
and address = addr_in
order by piece;
begin
for sqlpiece_rec in sqlpiece_cur
loop
temp_sqltxt := temp_sqltxt || sqlpiece_rec.sql_text;
end loop;
return temp_sqltxt;
end GetSQLtxt;
-- 至此已經找到影響效能的物件和sql語句,可以有針對性地最佳化
4. 把等待事件記入跟蹤檔案
重點:如果在跟蹤系統上的等待事件時,由於某種原因遇到了麻煩,則可以將這些等待事件記入一個跟蹤檔案。
方法:
-- 對於當前會話:
alter session set timed_statistics=true;
alter session set max_dump_file_size=unlimited;
alter session set events '10046 trace name context forever, level 12';
-- 執行應用程式,然後在USER_DUMP_DEST指出的目錄中找到跟蹤檔案。
-- 檢視檔案中以詞WAIT開始的所有行。
-- 對於其它的會話
-- 確定會話的程式ID(SPID)。下面的查詢識別出名稱以A開始的所有使用者的會話程式ID:
select S.Username, P.Spid from V$SESSION S, V$PROCESS P
where S.PADDR = P.ADDR and S.Username like 'A%';
-- 以 sysdba 進入sqlplus執行
alter session set timed_statistics=true;
alter session set max_dump_file_size=unlimited;
oradebug setospid
oradebug unlimit
oradebug event 10046 trace name context forever, level X /* Where X = (1,4,8,12) */
-- 在USER_DUMP_DEST 的值指出的目錄中利用SPID檢視跟蹤檔案
-- 檢視檔案中以詞WAIT開始的所有行。
5. 確定當前OS瓶頸
(1)Windows NT上的監控
使用控制皮膚-〉管理工具-〉效能即可
(2)UNIX上的監控
使用通用性的工具,包括sar、iostat、cpustat、mpstat、netstat、top、osview等。
1) CPU使用情況
sar -u 5 1000
%sys和%wio的數值應該小於百分之10到15
2) 裝置使用情況
sar -d 5 1000
在%busy超過60%時,最佳裝置利用率開始降低;在具有足夠磁碟快取記憶體的系統上,認為avserv為100毫秒的值非常高。
3) 虛擬記憶體使用情況
vmstat -S 5 1000
執行佇列(r)應該明確的平均小於(2*CPU數目)
6.最佳化所需的成分(應用程式、資料庫、I/O、爭用、OS等)。
7.跟蹤並實施更改控制過程。
8.測量並記錄當前效能
9.重複步驟3到7,直到滿足最佳化目標
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-1806108/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【效能最佳化】ORACLE資料庫效能最佳化概述Oracle資料庫
- Oracle SQL效能最佳化常用方法OracleSQL
- Oracle效能最佳化方法論的發展之二:基於OWI的效能最佳化方法論Oracle
- Oracle 效能調優 概述Oracle
- 常用的效能最佳化方法
- Oracle效能最佳化方法論的發展之一:基於區域性命中率分析的效能最佳化方法Oracle
- oracle 效能最佳化Oracle
- MySQL的基本概述MySql
- Web 效能最佳化方法Web
- Oracle SQL效能最佳化OracleSQL
- Oracle sql 效能最佳化OracleSQL
- 【基本功】深入剖析Swift效能最佳化Swift
- ORACLE資料庫效能優化概述Oracle資料庫優化
- Oracle Max()/Min()類的效能最佳化Oracle
- 【效能優化】ORACLE資料庫效能優化概述優化Oracle資料庫
- Oracle 效能最佳化小結Oracle
- ORACLE效能最佳化筆記Oracle筆記
- oracle大表效能最佳化Oracle
- Oracle效能最佳化之SQL最佳化(轉)OracleSQL
- 效能最佳化指南:效能最佳化的一般性原則與方法
- Oracle效能最佳化之應用最佳化(轉)Oracle
- Oracle效能最佳化之最佳化排序操作(轉)Oracle排序
- Oracle效能最佳化 之 共享池Oracle
- 效能最佳化的一般策略及方法
- Oracle效能最佳化之提升block的效率(轉)OracleBloC
- Oracle效能最佳化之Rollback(undo)Segment最佳化(轉)Oracle
- Oracle效能最佳化 之 庫快取Oracle快取
- Oracle效能最佳化之虛擬索引Oracle索引
- oracle SQL效能最佳化大總結OracleSQL
- ORACLE SQL效能最佳化系列 (十) (轉)OracleSQL
- Oracle效能最佳化之LockContention(轉)Oracle
- ORACLE SQL效能最佳化系列 (十一) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (一) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (二) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (三) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (四) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (九) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (五) (轉)OracleSQL