ora-1000初诊

每个使用 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值