以下的文章主要是對Oracle 性能優化基本方案的概述,Oracle 性能優化基本方案在實際中的應用比例還是占為多數的,如果你對這一技術,心存好奇的話,以下的文章將會揭開它的神秘面紗。
1)設立合理的Oracle 性能優化目標。
2)測量並記錄當前性能。
3)確定當前Oracle性能瓶頸(Oracle等待什麼、哪些SQL語句是該等待事件的成分)。
4)把等待事件記入跟蹤文件。
5)確定當前的OS瓶頸。
6)優化所需的成分(應用程序、數據庫、I/O、爭用、OS等)。
7)跟蹤並實施更改控制過程。
8)測量並記錄當前性能
9)重復步驟3到7,直到滿足優化目標
1.設立合理的Oracle 性能優化目標
重點:關於設立目標的最重要的一點是它們必須是可量化和可達到的。
方法:目標必須是當前性能和所需性能的的陳述形式的語句。只需填寫下列語句中的空格即可。
花費了 (時/分/秒),但要求它在 (時/分/秒)內執行。
使用了 (資源量),但它不能使用超過 。
2. 測量並記錄當前性能
重點:
(1)需要在峰值活動時間獲得當前系統性能快照
(2)關鍵是要在出現性能問題的時間段內采集信息
(3)必須在合理的時間段上采集,一般在峰值期間照幾個為期15分鐘的快照
方法:執行STATSPACK
建立Oracle 性能快照表空間
- 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;
至此已經找到影響Oracle 性能的對象和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 <SPID>
- 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上的監控
使用控制面板-〉管理工具-〉Oracle 性能即可
(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.測量並記錄當前Oracle 性能
9.重復步驟3到7,直到滿足優化目標