2009-06-18 5 views

ответ

39

Всего курсоры открытых по сессиям:

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, поэтому вы не можете получить более точную информацию; однако это также означает, что это точка-время (т. е. грязное чтение).

+6

Эти 'открытые курсоры тока' лениво пожинается таблицы сервера Oracle; поэтому число, которое вы видите для своего приложения, может быть аномально высоким, без того, чтобы вы допустили ошибку. См. Http://www.orafaq.com/node/758 –

8

Здесь можно найти открытые курсоры, которые были проанализированы. Вы должны войти в систему как пользователь с доступом к 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 будет иногда держать вещи открытыми дольше, чем вы.

+1

Собственно, это сложная ситуация. v $ open_cursor показывает, что выводит кешированные выражения. Открытые курсоры (ресурс, который может быть забит, если у вас есть указатель курсора/ResultSet) находится в v $ sessstat в строке с именем «open cursors current». –

+1

@Ollie: Но как это поможет вам идентифицировать SQL-запрос, который протекает? –

+0

Этот выбор показывает фактический код SQL, который открыл курсоры, отлично подходит для отладки! +1 от меня –

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

, похоже, подходит для меня.

1

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

я использую что-то вроде этого:

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

 Смежные вопросы

  • Нет связанных вопросов^_^