2012-04-27 25 views
5

Tengo una consulta ejecutándose en Oracle, que puede estar colgada o no. Se ha estado ejecutando durante ~ 10 horas, pero según la cantidad de datos que cargue, puede que no sea irracional.

Estaba viendo la sesión en gv $ session y me preguntaba si hay una forma de traducir esa información para ver si realmente hay actividad en curso o si la consulta está bloqueada esperando que se bloquee o cuelgue.

Ya he leído la documentación de esta vista here. Principalmente estoy buscando consejos de cualquiera que haya tenido experiencia en la depuración de este tipo de problemas en Oracle.

Gracias!

+1

¿Hay una entrada en 'v $ session_longops' que se puede comprobar para ver si se está progresando? También puede consultar este enlace para ver si su sesión está bloqueada: http://www.orafaq.com/node/854 – Ollie

+0

¡Gracias, puedo combinar esto con gv $ sqlarea para ver qué afirmaciones me están deteniendo! – Paul

Respuesta

7

En gv$session, la columna de la event te dice qué esperar caso de que su sesión está a la espera de. Si su sesión está esperando en algún tipo de bloqueo retenido por otra sesión, el event le dirá que (por ejemplo, será "enq: TX - contención de bloqueo de filas" si está en cola esperando bloquear una fila en otra sesión) y blocking_instance y blocking_session se rellenarán con la instancia y la ID de sesión del titular de la cerradura. También puede consultar seconds_in_wait (si es wait_time=0) para determinar cuántos segundos ha pasado la sesión en el evento de espera actual. Eso debería al menos decirle si su sesión está actualmente "atascada", pero no le dice si su consulta alguna vez va a terminar realmente. Si hay un plan malo, es muy posible que tenga "bueno". espere eventos como esperas de E/S de disco que indican que la sesión está haciendo algo pero que la consulta nunca terminará realmente.

+0

Excelente información. ¡Gracias! – Paul

+1

seleccione 'ALTER SYSTEM KILL SESSION' '' || sid || ',' || "SERIAL #" || '' ';', evento de gv $ session donde machine = 'your machine' es útil para generar los comandos para matarlos. Simplemente copia la columna de pegar 1 – JDPeckham

3

Basado en alguna investigación adicional y comentarios de Ollie me ocurrió con estas preguntas que ayudan a depurar el problema:

select s.sid, 
     s.username, 
     s.machine, 
     s.osuser, 
     cpu_time, 
     (elapsed_time/1000000)/60 as minutes, 
     sql_text 
from gv$sqlarea a, gv$session s 
where s.sql_id = a.sql_id 
and s.machine like '####'; 


select lo.*, 
     a.sql_text 
from gv$sqlarea a, gv$session_longops lo 
where lo.sql_id = a.sql_id 
and lo.sid = #### 
order by lo.start_time; 
+1

Sin consultar las columnas exactas en esas vistas, ¿no sería mejor vincular gv $ sqlarea a gv $ session_longops a través de SQL_ID? No estoy frente a mi PC en este momento, así que no puedo verificar :-( – Ollie

+2

Eso también funciona. Actualicé la respuesta. – Paul

0

Esto será útil para comprobar la Sesión de reproducción actual

select a.SID, a.SERIAL#, c.OBJECT_NAME 
from v$session a, v$locked_object b, user_objects c 
where a.SID=b.SESSION_ID and b.OBJECT_ID=c.OBJECT_ID 
Cuestiones relacionadas