Как найти текущие открытые курсоры в Oracle
Каков запрос, чтобы найти нет. текущих открытых курсоров в экземпляре Oracle?
Также, какова частота точности/обновления этих данных?
Я использую Oracle 10gR2
Ответы
Ответ 1
Открытие всех курсоров по сеансу:
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';
Источник: http://www.orafaq.com/node/758
Насколько я знаю, запросы на представления v $основаны на псевдотаблицах (таблицы "x $" ), которые указывают непосредственно на соответствующие части SGA, поэтому вы не можете получить более точную оценку; однако это также означает, что это точка-время (т.е. грязное чтение).
Ответ 2
Здесь, как найти открытые курсоры, которые были проанализированы. Вам необходимо войти в систему как пользователь с доступом к v $open_cursor и 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
;
Если вы предоставили часть текста SQL, это может быть полезно для идентификации проблемных приложений. Если курсор не был проанализирован, он не отображается здесь. Обратите внимание, что Oralce будет иногда держать вещи открытыми дольше, чем вы.
Ответ 3
select sql_text, count(*) as "OPEN CURSORS", user_name from v$open_cursor
group by sql_text, user_name order by count(*) desc;
похоже, работает для меня.
Ответ 4
1) ваш идентификатор должен иметь доступ к 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;
Ответ 5
В Oracle есть страница для этой проблемы с SQL и предложения по устранению неполадок.
"Устранение неполадок с открытым курсором"
http://docs.oracle.com/cd/E40329_01/admin.1112/e27149/cursor.htm#OMADM5352
Ответ 6
Я использую что-то вроде этого:
select
user_name,
count(*) as "OPEN CURSORS"
from
v$open_cursor
group by
user_name;