36

查找 Oracle 实例中当前打开的游标数量的查询是什么?

另外,这些数据的准确性/更新频率是多少?

我正在使用 Oracle 10gR2

4

8 回答 8

47

打开的游标总数,按会话:

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$ 视图的查询基于直接指向 SGA 相关部分的伪表(“x$”表),因此您无法获得比这更准确的信息;然而,这也意味着它是时间点(即脏读)。

于 2009-06-18T05:36:46.740 回答
13
select  sql_text, count(*) as "OPEN CURSORS", user_name from v$open_cursor
group by sql_text, user_name order by count(*) desc;

似乎对我有用。

于 2013-08-29T15:38:25.110 回答
9

以下是如何查找已解析的打开游标。您需要以有权访问 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
;

If 为您提供部分 SQL 文本,因此它可用于识别泄漏的应用程序。如果游标没有被解析,那么它就不会出现在这里。请注意,Oralce 有时会比您保持打开的时间更长。

于 2009-06-18T06:55:16.283 回答
2

1)您的 id 应该具有 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;
于 2014-07-01T08:53:24.620 回答
1

Oracle 有一个关于此问题的页面,其中包含 SQL 和故障排除建议。

“解决打开光标问题” http://docs.oracle.com/cd/E40329_01/admin.1112/e27149/cursor.htm#OMADM5352

于 2015-02-07T06:22:59.590 回答
0

我使用这样的东西:

select 
  user_name, 
  count(*) as "OPEN CURSORS" 
from 
  v$open_cursor 
group by 
  user_name;
于 2017-07-03T18:59:42.157 回答
0

我会使用这个快速 SQL 来比较当前的最高使用量与允许的最大值。这将允许您立即查看是否有任何进程对游标的使用率过高。

SELECT MAX (a.VALUE) AS highest_open_cur, p.VALUE AS max_open_cur
FROM v$sesstat a, v$statname b, v$parameter p
WHERE a.statistic# = b.statistic#
AND b.name = 'opened cursors current'
AND p.name = 'open_cursors'
GROUP BY p.VALUE;

从上面的 SQL 中可能很清楚,OPEN_CURSORS 值是一个 Oracle 参数,可以像这样在运行时找到。

SELECT * FROM v$parameter WHERE NAME = 'open_cursors';

您可能需要 sysdba 或同等权限才能查询上述表。

于 2021-11-30T10:01:44.570 回答
0

这可以工作:

SELECT    sql_text "SQL Query", 
          Count(*) AS "Open Cursors" 
FROM      v$open_cursor 
GROUP BY  sql_text 
HAVING    Count(*) > 2 
ORDER BY  Count(*) DESC; 
于 2021-02-01T17:36:43.543 回答