程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 對Oracle 性能調優的基本方案

對Oracle 性能調優的基本方案

編輯:Oracle數據庫基礎

以下的文章主要是對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 性能快照表空間

  1. sqlplus sys as sysdba  
  2. create tablespace perfstat datafile '/u02/oradata/dbnms/perfstat.dbf' size 500M extent management local; 

安裝STATSPACK 

  1. @$Oracle_HOME/rdbms/admin/spcreate.sql; 

獲取性能數據,可以生成多個快照

  1. sqlplus perfstat  
  2. execute statspack.snap; 

生成性能快照的報表

  1. sqlplus perfstat  
  2. select min(snap_id) snapid_min, max(snap_id) snapid_max from stats$snapshot;  
  3. @$Oracle_HOME/rdbms/admin/spreport; 

該報告中有關於性能的重要信息,如前5位的等待事件、cache大小、各種內存結構的命中率、每秒及每事務邏輯、物理讀寫數據塊數、性能最差的sql語句等

3. 確定當前Oracle性能瓶頸

重點:從Oracle 等待接口v$system_event、v$session_event和v$session_wait中獲得等待事件,進而找出影響性能的對象和sql語句

方法:

首先,利用v$system_event視圖執行下面的查詢查看數據庫中某些常見的等待事件:

  1. select * from v$system_event  
  2. where event in ('buffer busy waits',  
  3. 'db file sequential read',  
  4. 'db file scattered read',  
  5. 'enqueue',  
  6. 'free buffer waits',  
  7. 'latch free',  
  8. 'log file parallel write',  
  9. 'log file sync'); 

接著,利用下面對v$session_event和v$session視圖進行的查詢,研究具有對上面顯示的內容有貢獻的等待事件的會話:

  1. select se.sid,s.username,se.event,se.total_waits,se.time_waited,se.average_wait  
  2. from v$session s,v$session_event se  
  3. where s.sid = se.sid  
  4. and se.event not like 'SQL*Net%'  
  5. and s.status = 'ACTIVE' 
  6. and s.username is not null; 

使用下面查詢找到與所連接的會話有關的當前等待事件。這些信息是動態的,為了查看一個會話的等待最多的事件是什麼,需要多次執行此查詢。

  1. select sw.sid,s.username,sw.event,sw.wait_time,sw.state,sw.seconds_in_wait SEC_IN_WAIT  
  2. from v$session s,v$session_wait sw  
  3. where s.sid = sw.sid  
  4. and sw.event not like 'SQL*Net%'  
  5. and s.username is not null  
  6. order by sw.wait_time desc; 

查詢會話等待事件的詳細信息

  1. select sid,event,p1text,p1,p2text,p2,p3text,p3  
  2. from v$session_wait  
  3. where sid between &1 and &2  
  4. and event not like '%SQL%'  
  5. and event not like '%rdbms%'; 

利用P1、P2的信息,找出等待事件的相關的段

  1. select owner,segment_name,segment_type,tablespace_name  
  2. from dba_extents  
  3. where file_id = &fileid_in  
  4. and &blockid_in between block_id and block_id + blocks - 1; 

獲得操作該段的sql語句:

  1. select sid, getsqltxt(sql_hash_value,sql_address)  
  2. from v$session  
  3. where sid = &sid_in; 

getsqltxt函數

  1. create or replace  
  2. function GetSQLtxt (hashaddr_in in v$sqltext.hash_value%type,  
  3. addr_in in v$sqltext.address%type)  
  4. return varchar2  
  5. is  
  6. temp_sqltxt varchar2(32767);  
  7. cursor sqlpIEce_cur  
  8. is  
  9. select pIEce,sql_text  
  10. from v$sqltext  
  11. where hash_value = hashaddr_in 
  12. and address = addr_in 
  13. order by pIEce;  
  14. begin  
  15. for sqlpiece_rec in sqlpIEce_cur  
  16. loop  
  17. temp_sqltxt :temp_sqltxt || sqlpIEce_rec.sql_text;  
  18. end loop;  
  19. return temp_sqltxt;  
  20. end GetSQLtxt; 

至此已經找到影響Oracle 性能的對象和sql語句,可以有針對性地優化

4. 把等待事件記入跟蹤文件

重點:如果在跟蹤系統上的等待事件時,由於某種原因遇到了麻煩,則可以將這些等待事件記入一個跟蹤文件。

方法:

對於當前會話:

  1. alter session set timed_statistics=true;  
  2. alter session set max_dump_file_size=unlimited;  
  3. alter session set events '10046 trace name context forever, level 12'; 

執行應用程序,然後在USER_DUMP_DEST指出的目錄中找到跟蹤文件。

查看文件中以詞WAIT開始的所有行。

對於其它的會話

確定會話的進程ID(SPID)。下面的查詢識別出名稱以A開始的所有用戶的會話進程ID:

  1. select S.Username, P.Spid from V$SESSION S, V$PROCESS P  
  2. where S.PADDR = P.ADDR and S.Username like 'A%'; 

以 sysdba 進入sqlplus執行

  1. alter session set timed_statistics=true;  
  2. alter session set max_dump_file_size=unlimited;  
  3. oradebug setospid <SPID> 
  4. oradebug unlimit  
  5. 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,直到滿足優化目標

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved