每个使用 oracle 数据库作为后端存储库的应用程序都运行多个 SQL 语句。
对于 oracle 数据库中的每个 SQL 语句执行,都会分配内存中的特定区域。Oracle PL/SQL 允许您命名此区域。此专用 SQL 区域称为上下文区域或游标。这些游标占用共享池(oracle 数据库的基本内存组件)中的空间,特别是在库缓存中。为了防止叛逆会话填满库缓存,或用数百万个解析请求阻塞 CPU,我们将参数设置为 OPEN_CURSORS。
将这些游标的值/限制定义为数据库实例中称为 OPEN_CUSRSORS 的数据库参数。
OPEN_CURSORS DB 参数设置每个会话每个会话可以打开的最大游标数。例如,如果OPEN_CURSORS值设置为 1000,则每个会话一次最多可以打开 1000 个游标。
解决上述open_cursors问题的步骤如下
col USERNAME for a22
select * from (
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'
and s.username is not null order by a.value desc) where rownum<11;
使用下面的 SQL 查看哪些查询导致打开的游标最大化:
col USER_NAME for a22
col sql_text for a80
select sid ,sql_text, user_name, count(*) as "OPEN CURSORS" from v$open_cursor
where sid in (&SID) group by sid ,sql_text, user_name;
它将提供打开最大游标而不是正常关闭后续游标的顶级查询
其他
SELECT s.machine, oc.user_name, oc.sql_text, count(1)
FROM v$open_cursor oc,v$session s
WHERE oc.sid = s.sid and user_name != 'SYS'
GROUP BY user_name,sql_text, machine
HAVING COUNT(1) > 5 ORDER BY count(1) DESC;
要查看是否已将OPEN_CURSORS设置得足够高,请监视 v$sesstat 以获取当前打开的最大光标。如果您的会话运行接近限制,请增加 OPEN_CURSORS 的值
col MAX_OPEN_CUR for a20
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;
参考:ID 1477783.1

237

被折叠的 条评论
为什么被折叠?



