关于open_cursors跟session_cached_cursors的参数值(转载)
一、如何正确设置session_cached_cursors参数: 正确设置open_cursors和'session_cached_cursors' 可以减少sql解析,提高系统性能,那么,如何正确设置'session_cached_cursors' 这个参数呢?我们可以把握下面的原则: 1、'session_cached_cursors' 数量要小于open_cursor,设置方法: SQL> show parameter cursors NAME TYPE VALUE alter system set open_cursors=1500 scope=both; alter system set session_cached_cursors=1000 scope=spfile; (初始化文件使用了spfile) open_cursors:该参数含义是同一个session同时打开最多在使用的游标数。 session_cached_cursors:SESSION_CACHED_CURSORS, 就是说的是一个session可以缓存多少个cursor,让后续相同的SQL语句不再打开游标,从而避免软解析的过程来提高性能。(绑定变量是解决硬解 析的问题),软解析同硬解析一样,比较消耗资源.所以这个参数非常重要。 在oracle 9.2.0.1.0里修改会报下面的报,这是9i版本的一个bug,可在先在init文件里改好,再修改spfile文件。 ORA-02096: 此选项的指定初始化参数不可修改 2、要考虑共享池的大小 3、使用下面的sql判断'session_cached_cursors' 的使用情况。如果使用率为100%则增大这个参数值。 Select 'session_cached_cursors' Parameter, 二、下面是一篇关于v$open_cursor与session_cached_cursor文件章,引用一下: v$open_cursor与session_cached_cursorv$open_cursor是oracle提供的一张查看每个session打开过的cursor的视图,它的表结构如下 当我们执行一条sql语句的时候,我们将会在shared pool产生一个library cache object,cursor就是其中针对于sql语句的一种library cache object.另外我们会在pga有一个cursor的拷贝,同时在客户端会有一个statement handle,这些都被称为cursor,在v$open_cursor里面我们可以看到当前打开的cursor和pga内cached cursor. session_cached_cursor 下面做个实验来证明以上这些理论 SQL> select distinct sid from v$mystat; SID
NAME TYPE VALUE 这是设置session_cached_cursors为0,禁止了cache cursor的功能 我们另开一个sqlplus来看v$open_cursor SQL> select * from v$open_cursor where sid=12; SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT 能在v$open_cursor里看到这条sql 执行下一条语句 OWNER 在来看v$open_cursor有什么变化 SQL> / SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT 可以看到语句变了,来看看current open cursor和session cached cursor的数目 SID NAME USED 我们来把session_cached_cursors修改成1 Session altered. 再执行上面的语句 SQL> select owner from test where rownum=1; OWNER 看看v$open_cursor SQL> select * from v$open_cursor where sid=12; SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT
此处执行3次 select * from v$open_cursor where sid=12,oracle进行了3次soft parse OWNER OWNER 然后再执行 SQL> select distinct sid from v$mystat; SID 再来看看v$open_cursor有什么变化 SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT v$open_cursor有了两条记录,再看一下current open cursor和session cached cursor的数目 SQL> select sid,n.name,s.value used SID NAME USED 再执行一条新的语句 OWNER 看一下v$open_cursor SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT 可以看到上一次的"select distinct sid from v$mystat"已经被关闭,在v$open_cursor中不可见,但是cached cursor "select owner from test where rownum=1"还能看到 这时候运行3次select distinct sid from v$mystat SID SID SID SQL> select owner from test where rownum<2; OWNER
SQL> select * from v$open_cursor where sid=12; SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT 发现原来cached cursor"select owner from test where rownum=1"已经被替换出了session cursor cache,而变成了"select distinct sid from v$mystat" 我们再修改session_cached_cursors alter session set session_cached_cursors=2; 再重复一下上面的过程,再去看v$open_cursor SQL> / SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT 可以看到现在有3个cursor,看一下current open cursor和session cached cursor的数目
SID NAME USED 从这个实验我们可以清楚得看到v$open_cursor视图和session_cached_cursors参数的作用. 在这里再提一下另一个与cursor有关的参数open_cursors,这个参数限制了每个session可以打开的最多cursor,如果当前打开的cursor数超过了open_cursor就会报ORA-01000: maximum open cursors exceeded,通常在使用java connection pool时如果处理不当将会导致ORA-01000,如果java应用服务器端使用软关闭cursor,并保留这些cursor在在cache size,那么数据库端认为这个cursor还是打开的,.所以在open_cursors,session_cached_cursors等参数时一定要和应用端的cursor cache size等参数搭配好. |