【问题标题】:How to find Current open Cursors in Oracle如何在 Oracle 中查找当前打开的游标
【发布时间】:2010-11-03 21:33:08
【问题描述】:

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

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

我正在使用 Oracle 10gR2

【问题讨论】:

    标签: oracle oracle10g database-cursor


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

    【讨论】:

    • 这些“当前打开的游标”被 Oracle 表服务器懒惰地获取;因此,您在申请中看到的数字可能异常高,但这并不意味着您犯了错误。见orafaq.com/node/758
    • 如果这对您不起作用,请先尝试使用以下命令授予自己所需的权限:sqlplus "/ as sysdba"
    【解决方案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
    ;
    

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

    【讨论】:

    • 其实这是一个复杂的情况。 v$open_cursor 恰好显示缓存语句。打开的游标(如果您有游标/ResultSet 泄漏,可以锤击的资源)位于名为“打开的游标当前”的行中的 v$sessstat 中。
    • @Ollie:但这如何帮助您识别正在泄漏的 SQL 语句?
    • 这个选择显示了打开游标的实际 SQL 代码,非常适合调试! +1 来自我
    【解决方案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)您的 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;
      

      【讨论】:

        【解决方案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;
          

          【讨论】:

            【解决方案7】:

            这可以工作:

            SELECT    sql_text "SQL Query", 
                      Count(*) AS "Open Cursors" 
            FROM      v$open_cursor 
            GROUP BY  sql_text 
            HAVING    Count(*) > 2 
            ORDER BY  Count(*) DESC; 
            

            【讨论】:

              【解决方案8】:

              我会使用这个快速 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 或同等权限才能查询上述表格。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-05-15
                • 2011-01-24
                • 1970-01-01
                • 2015-03-05
                • 2023-03-18
                相关资源
                最近更新 更多