2011-11-28 7 views

risposta

3

Si potrebbe interrogare le tabelle AWR direttamente, che può essere il modo più semplice.

Oppure, una tecnica semplice che usavo su Oracle 8i senza statistiche abilitate, era quella di selezionare l'SQL con il buffer più alto che arriva al rapporto di esecuzione da v $ sql. Si può giocare con questa query per la ricerca solo per le interrogazioni alto numero di esecuzione, o quelli che fanno alta O fisico ecc

Le tabelle AWR e cenere darà una migliore informazione, ma questo potrebbe essere un semplice primo passo:

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 per riproduzione. Potresti mostrarmi quale query devo usare per ottenere i dati da AWR? Più costose istruzioni SQL. Come in questa immagine: http://docs.oracle.com/cd/B19306_01/server.102/b28051/tdppt_sqlid.htm#BABECDJG? BTW. Che ne dici di v $ sqlarea view? – Marshall

+0

Molte di quelle statistiche in tempo reale provengono dalle tabelle di ASH. Se si dovesse avviare il gestore aziendale, è possibile tracciare la propria sessione e vedere quali SQL è in esecuzione per generare tali grafici. Dai un'occhiata a v $ active_session_history e guarda cosa riesci a capire. –

1

per trovare rapidamente se si hanno a lungo in esecuzione processi che le vostre risorse guardare V $ sesson_long_ops:

SELECT * FROM v$session_longops 

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

Io vi consiglio di dare un'occhiata a questo troppo: http://docs.oracle.com/cd/B28359_01/server.111/b28274/instance_tune.htm

Si può quindi prendere il SID per trovare l'SQL che è in esecuzione:

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 

Se si esegue unix Si potrebbe anche dare un'occhiata al comando top (top10 o su diversi tipi di unix) si potrebbe quindi prendere gli ID di processo delle query che consumano più cpu, quindi utilizzare quanto segue per ottenere lo sql incriminato.

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