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
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).
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.
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.
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;
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
J'utilise quelque chose comme ça:
select
user_name,
count(*) as "OPEN CURSORS"
from
v$open_cursor
group by
user_name;