2011-11-28 13 views

Respuesta

3

Puede consultar directamente las tablas AWR, que puede ser la forma más sencilla.

O, una técnica simple que solía usar en Oracle 8i sin estadísticas habilitadas, era seleccionar el SQL con la mayor relación de ejecución de búfer entre v $ sql. Se puede jugar con esta consulta sólo para buscar las consultas de alta densidad de ejecución, o los que hacen alta S física, etc.

Las tablas AWR y ASH dará una mejor información, pero esto podría ser un primer paso simple:

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. ¿Podría mostrarme qué consulta debo usar para obtener datos de AWR? Declaraciones sql más caras. Como en esta imagen: http://docs.oracle.com/cd/B19306_01/server.102/b28051/tdppt_sqlid.htm#BABECDJG? BTW. ¿Qué tal v $ sqlarea vista? – Marshall

+0

Muchas de esas estadísticas en tiempo real provienen de las tablas de ASH. Si fuera a iniciar el administrador de la empresa, podría rastrear su sesión y ver qué SQL está ejecutando para generar esos gráficos. Eche un vistazo a v $ active_session_history y vea lo que puede averiguar. –

1

para encontrar rápidamente si tiene procesos que tienen sus recursos correr larga mira v $ sesson_long_ops:

SELECT * FROM v$session_longops 

véase: http://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_2092.htm

Yo aconsejaría que echar un vistazo a esto también: http://docs.oracle.com/cd/B28359_01/server.111/b28274/instance_tune.htm

, entonces puede tomar el SID para encontrar el SQL que se está ejecutando:

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 

Si está ejecutando Unix También puede echar un vistazo en el comando top (top10 o topas en diferentes sabores de Unix) puede entonces tomar los identificadores de proceso de las consultas que consumen la mayor cantidad de CPU y luego usar lo siguiente para obtener el sql ofensor.

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