oracle修改open_cursors,oracle的open_cursors问题探究

本文探讨了Oracle中的open_cursors参数问题,通过实验验证了游标的使用情况。作者在学习中发现,执行SQL并不会直接增加open_cursors的value,而是与cursor_type为open的状态相关。同时,文中提到了open_cursors参数过大可能引发的PGA内存问题及对library cache的影响,分享了监控剩余游标数的方法,并表示将进一步研究其对Share Pool的影响。

今天老魏遇到了一个这样的问题,

在google之后,发现讲open_cursors参数调大一些,就可以避免这样的问题(具体操作方法,可以自行百度/google)。

老魏在学习的时候,对这个游标的概念有点傻傻分不清,于是花费了一些时间,想把这个问题搞懂。

对于这个问题的实践,我参考了asktom上面,tom大师的回复。

我先阐述一下最开始的设想,我认为每执行一条sql语句,都会占用一个opencursor,并且会使v$sesstat的value值成比例增加。

为了验证我的猜想,我开始了下面的实验。

session1

SYS@orcl> select userenv('sid') from dual;

USERENV('SID')

--------------

1

SYS@orcl> select count(*) from dba_objects;

COUNT(*)

----------

13748

session2 查看sid=1的value值

SYS@orcl> select sid,value,b.class from v$sesstat a,v$statname b where a.statistic#=b.statistic# and name='opened cursors current' and a.sid=1 order by 2

2  ;

SID      VALUE      CLASS

---------- ---------- ----------

1          1          1

这时候,session1 无论执行多少sql语句,都不会使value增加,这引起了我的好奇,于是我在session2执行了下面的语句

8f8d07cd048042d23e5f8faf4152dbca.png

我们可以看到,在上面的结果集中,只有一个cursor_type是open的,是否说明value值,与这个是相关的呢?

参考tom的回答(回答别的网友),我在session1采取了以下的操作

SYS@orcl> variable x refcursor;

SYS@orcl>       variable z refcursor;

SYS@orcl>        variable b refcursor;

SYS@orcl>         variable a refcursor;

SYS@orcl> exec open :x for select * from dual;

PL/SQL procedure successfully completed.

SYS@orcl> exec open :z for select * from dual;

PL/SQL procedure successfully completed.

SYS@orcl> exec open :b for select * from dual;

PL/SQL procedure successfully completed.

SYS@orcl> exec open :a for select * from dual;

PL/SQL procedure successfully completed.

在session2在来执行查看语句

d535f77c5b6e5fb8b4a4fe237072d292.png

e54827191129b9ed5c242ac520920e83.png

至此,我猜测,value只统计cursor_type为open的值。不仅仅plsql中的cursor,而且java中的createStatement和prepareStatement 也相当于cursor,都会增长value值,当达到open_cursor参数的最大值,再执行打开游标的动作,将会抛出ora-01000的问题。

我们可以通过以下语句对cursor剩余数量进行一下监控。

select value-(select  max(value)from v$mystat a, v$statname b

where a.statistic# = b.statistic#

and b.name = 'opened cursors current')

from v$parameter where name='open_cursors';

老魏之前看书的时候,看到open_cursor参数过大,会引起PGA内存紧张。但是今天在google上看到了这样一种说法,

会在library cache 中分配 open_cursor参数个slot,按照这个说法,应该会对share pool会有影响。。。。我当时dump了一下library cache,但是并没有发现有关说法,这个问题就留到待我对oracle有更加深入的了解之后了。今天就简单的分享这么多,老魏文采不好,可能有些地方思维跳跃度比较大,望谅解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值