2009-06-18 6 views

Répondre

39

curseurs total ouvert, par session:

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'; 

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

Pour autant que je sais des requêtes sur v vues de $ sont basées sur des pseudo-tables (tables "x $") qui pointent directement sur les parties pertinentes du SGA, de sorte que vous ne pouvez pas obtenir plus précis que cela; cependant, cela signifie également qu'il s'agit d'un point dans le temps (c'est-à-dire une lecture incorrecte).

+6

Ces 'cours ouverts les curseurs' sont paresseusement moissonné par le serveur de table Oracle; donc le nombre que vous voyez pour votre application peut être anormalement élevé sans vouloir dire que vous avez fait une erreur. Voir http://www.orafaq.com/node/758 –

8

Voici comment trouver les curseurs ouverts qui ont été analysés. Vous devez être connecté en tant qu'utilisateur ayant accès à v $ open_cursor et 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 cela vous donne une partie du texte SQL, cela peut être utile pour identifier les applications qui fuient. Si un curseur n'a pas été analysé, il n'apparaît pas ici. Notez qu'Oralce garde parfois les choses ouvertes plus longtemps que vous.

+1

En fait, c'est une situation complexe. v $ open_cursor arrive à afficher des instructions en cache. Les curseurs ouverts (la ressource qui peut être martelée si vous avez une fuite curseur/ResultSet) se trouvent dans v $ sessstat dans une ligne nommée 'curseurs ouverts courants'. –

+1

@Ollie: Mais comment cela vous aide-t-il à identifier l'instruction SQL qui fuit? –

+0

Cette sélection vous montre le code SQL réel qui a ouvert les curseurs, idéal pour le débogage! +1 de moi –

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

semble fonctionner pour moi.

1

1) votre identifiant doit avoir accès 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

-je utiliser quelque chose comme ceci:

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