2009-06-18 136 views

Respuesta

39

cursores totales abierta, por sesión:

select a.value, s.username, s.sid, s.serial# 
from v$sesstat a, v$statname b, v$session s 
where a.statistic# = b.statistic# and s.sid=a.sid 
and b.name = 'opened cursors current'; 

Fuente: http://www.orafaq.com/node/758

Por lo que yo sé consultas en vistas $ V se basa en seudo-mesas (tablas "x $") que apuntan directamente a las partes relevantes del SGA, por lo que no puede obtener más precisión que eso; sin embargo, esto también significa que se trata de un punto en el tiempo (es decir, lectura sucia).

+6

Estos 'cursores abiertos actual' se perezosamente cosechado por el servidor de tabla de Oracle; por lo que el número que ve para su aplicación puede ser anómalamente alto sin que signifique que cometió un error. Ver http://www.orafaq.com/node/758 –

8

Aquí se explica cómo encontrar los cursores abiertos que se han analizado. Debe iniciar sesión como usuario con acceso a v $ open_cursor y v $ session.

COLUMN USER_NAME FORMAT A15 

SELECT s.machine, oc.user_name, oc.sql_text, count(1) 
FROM v$open_cursor oc, v$session s 
WHERE oc.sid = s.sid 
GROUP BY user_name, sql_text, machine 
HAVING COUNT(1) > 2 
ORDER BY count(1) DESC 
; 

Si le proporciona parte del texto SQL, puede ser útil para identificar aplicaciones con fugas. Si un cursor no ha sido analizado, entonces no aparece aquí. Tenga en cuenta que Oralce algunas veces mantendrá las cosas abiertas más tiempo que usted.

+1

En realidad, esta es una situación compleja. v $ open_cursor pasa a mostrar estados de cuenta en caché. Abrir cursores (el recurso que puede ser martillado si tiene una fuga de cursor/ResultSet) está en v $ sessstat en una fila llamada 'current current current'. –

+1

@Ollie: ¿Pero cómo lo ayuda a identificar la declaración SQL que se está filtrando? –

+0

Esta selección muestra el código SQL actual que abrió los cursores, ideal para la depuración. +1 de mi parte –

8
select sql_text, count(*) as "OPEN CURSORS", user_name from v$open_cursor 
group by sql_text, user_name order by count(*) desc; 

parece funcionar para mí.

1

1) su número de identificación debe tener acceso sys dba 2)

select sum(a.value) total_cur, avg(a.value) avg_cur, max(a.value) max_cur, 
s.username, s.machine 
from v$sesstat a, v$statname b, v$session s 
where a.statistic# = b.statistic# and s.sid=a.sid 
and b.name = 'opened cursors current' 
group by s.username, s.machine 
order by 1 desc; 
0

que usar algo como esto:

select 
    user_name, 
    count(*) as "OPEN CURSORS" 
from 
    v$open_cursor 
group by 
    user_name; 
Cuestiones relacionadas