2011-11-28 74 views

回答

3

您可以直接查詢AWR表,這可能是最簡單的方法。

或者,我以前在Oracle 8i上使用的一個簡單技術,沒有啓用統計信息,就是從v $ sql中選擇具有最高緩衝區獲取執行率的SQL。您可以使用此查詢發揮只搜索高執行數查詢,或者那些做高物理IO等

的AWR和ASH表將提供更好的信息,但是這可能是一個簡單的第一步:

select a.sql_id, a.ratio, a.executions 
from 
(
    select sql_id, buffer_gets/executions ratio, executions 
    from v$sql 
    where executions > 10 
    order by 2 desc 
) a 
where rownum <= 10 
+0

Thx for replay。你能告訴我什麼查詢我必須使用從AWR獲取數據?最昂貴的SQL語句。就像這樣:http://docs.oracle.com/cd/B19306_01/server.102/b28051/tdppt_sqlid.htm#BABECDJG? 順便說一句。如何v $ sqlarea視圖? – Marshall

+0

許多這些實時統計來自ASH表。如果您要啓動企業管理器,您可以跟蹤其會話並查看它正在執行哪些SQL來生成這些圖表。看看v $ active_session_history,看看你能想出什麼。 –

1

要快速找到,如果你有長時間運行佔用你的資源流程看v $ sesson_long_ops:

SELECT * FROM v$session_longops 

見:http://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_2092.htm

我勸你看看這太:http://docs.oracle.com/cd/B28359_01/server.111/b28274/instance_tune.htm

然後,您可以乘坐SID查找正在運行的SQL:

SELECT sql_text FROM v$session s 
LEFT JOIN v$sqlarea sa ON s.sql_hash_value=sa.hash_value AND s.sql_address=sa.address 
WHERE sid=&sid 

如果您正在運行UNIX您還可以看看在top命令(top10topas在不同的unix口味) 然後,你可以採取消耗最多CPU的查詢的進程ID,然後使用以下來獲得有問題的SQL。

SELECT 
    s.username, 
    sa.sql_text 
FROM v$process p 
INNER JOIN v$session s ON p.addr=s.paddr 
LEFT JOIN v$sqlarea sa ON s.sql_hash_value=sa.hash_value AND s.sql_address=sa.address 
WHERE s.username IS NOT NULL AND p.spid=&SPID