web-dev-qa-db-fra.com

Comment trouver les curseurs actuellement ouverts dans Oracle

Quelle est la requête pour trouver le no. des curseurs ouverts actuels dans une instance Oracle?

Aussi, quelle est la précision/fréquence de mise à jour de ces données?

J'utilise Oracle 10gR2

31
M.N

Nombre total de curseurs ouverts, 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

Autant que je sache, les requêtes sur v $ views sont basées sur des pseudo-tables ("x $") qui pointent directement vers les parties pertinentes de la SGA. Vous ne pouvez donc pas obtenir plus de précision. Cependant, cela signifie également qu'il s'agit d'un point dans le temps (c'est-à-dire une lecture sale).

41
Jeffrey Kemp
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. 

10
Mark Kluepfel

Voici comment trouver des 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 vous donne une partie du texte SQL, cela peut donc être utile pour identifier les applications qui présentent des fuites. Si un curseur n'a pas été analysé, il n'apparaît pas ici. Notez qu'Oralce gardera parfois les choses ouvertes plus longtemps que vous.

8
WW.

1) votre identifiant doit avoir un 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;
1
praveen s

Oracle a une page sur ce problème avec SQL et des suggestions de dépannage.

"Résolution des problèmes de curseur ouvert" http://docs.Oracle.com/cd/E40329_01/admin.1112/e27149/cursor.htm#OMADM5352

1
Rana Ian

J'utilise quelque chose comme ça:

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