Как найти Текущие открытые Курсоры в Oracle - PullRequest
31 голосов
/ 18 июня 2009

Какой запрос найти нет. текущих открытых курсоров в экземпляре Oracle?

Кроме того, какова точность / частота обновления этих данных?

Я использую Oracle 10gR2

Ответы [ 6 ]

44 голосов
/ 18 июня 2009

Всего открытых курсоров по сеансам:

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

11 голосов
/ 29 августа 2013
select  sql_text, count(*) as "OPEN CURSORS", user_name from v$open_cursor
group by sql_text, user_name order by count(*) desc;

, кажется, работает на меня.

8 голосов
/ 18 июня 2009

Вот как найти открытые курсоры, которые были проанализированы. Вы должны войти в систему как пользователь с доступом к 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 голос
/ 07 февраля 2015

У Oracle есть страница для этой проблемы с SQL и предложениями по устранению неполадок.

«Устранение неполадок, связанных с открытыми курсорами» http://docs.oracle.com/cd/E40329_01/admin.1112/e27149/cursor.htm#OMADM5352

1 голос
/ 01 июля 2014

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 голосов
/ 03 июля 2017

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

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