Linux 2.4.21-20.ELsmp (YY075) 05/19/2005
10:36:07 AM CPU %user %nice %system %idle
10:36:09 AM all 0.00 0.00 0.13 99.87
10:36:11 AM all 0.00 0.00 0.00 100.00
10:36:13 AM all 0.25 0.00 0.25 99.49
10:36:15 AM all 0.13 0.00 0.13 99.75
10:36:17 AM all 0.00 0.00 0.00 100.00
10:36:17 AM CPU %user %nice %system %idle
10:36:19 AM all 0.00 0.00 0.00 100.00
10:36:21 AM all 0.00 0.00 0.00 100.00
10:36:23 AM all 0.00 0.00 0.00 100.00
10:36:25 AM all 0.00 0.00 0.00 100.00
3、如何找到點用系用資源特別大的Oracle的session及其執行的語句。
Hp-unix可以用glance,top
IBM AIX可以用topas
此外可以使用ps的命令。
通過這些程式我們可以找到點用系統資源特別大的這些進程的進程號,我們就可以通過以下的sql語句發現這個pid正在執行哪個sql,這個sql最好在pl/sql developer,toad等軟體中執行, 把<>中的spid換成你的spid就可以了。
SELECT a.username,a.machine,a.program,a.sid,a.serial#,a.status,c.piece,c.sql_text from v$session a,v$process b,v$sqltext c WHERE b.spid='ORCL' AND b.addr=a.paddr AND a.sql_address=c.address(+)order BY c.piece
我們就可以把得到的這個sql分析一下,看一下它的執行計畫是否走索引,對其最佳化避免全表掃描,以減少IO等待,從而加快語句的執行速度。
比如:
SELECT col1,col2,col3 FROM table1 a
WHERE a.col1 not in (SELECT col1 FROM table2)
可以換成:
SELECT col1,col2,col3 FROM table1 a
WHERE not exists
(SELECT 'x' FROM table2 b
WHERE a.col1=b.col1)
4、另一個有用的指令碼:尋找前十條效能差的sql.
SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea
order BY disk_reads DESC )where ROWNUM<10 ;
二、迅速發現Oracle Server的效能問題的成因,我們可以求助於v$session_wait這個視圖,看系統的這些session在等什麼,使用了多少的IO。以下是我提供的參考指令碼:
指令碼說明:查看佔io較大的正在啟動並執行session
SELECT se.sid,se.serial#,pr.SPID,se.username,se.status,se.terminal,se.program,se.MODULE, se.sql_address,st.event,st.p1text,si.physical_reads,si.block_changes FROM v$session se, v$session_wait st,v$sess_io si,v$process pr
WHERE st.sid=se.sid AND st.sid=si.sid
AND se.PADDR=pr.ADDR
AND se.sid>6
AND st.wait_time=0
AND st.event NOT LIKE '%SQL%'
ORDER BY physical_reads DESC
對檢索出的結果的幾點說明:
1、我是按每個正在等待的session已經發生的物理讀排的序,因為它與實際的IO相關。
2、你可以看一下這些等待的進程都在忙什麼,語句是否合理?
Select sql_address from v$session where sid=;
Select * from v$sqltext where address=;
執行以上兩個語句便可以得到這個session的語句。
你也以用alter system kill session 'sid,serial#';把這個session殺掉。