open_cursors 参数控制单个session 打开的cursor的数量。
v$open_cursor 是所有session(打开的cursor)的总和。
session_cached_cursors 指一个session可以缓存多少个cursor,让后续相同的SQL语句不再打开游标,从而避免软解析的过程来提高性能,是软软解析的关键所在。
设置pga端的cache list的长度,当session_cached_cursors设置为0时,pga的cache list长度为0,这时候当sga中的cursor关闭的时候它相关的library cache handle的lock位被清0,从v$open_cursor里看不到这个被关闭的cursor,它服从于shared pool的lru机制,当shared pool需要新的buffer空间时,它将会被flush出shared pool。当session_cached_cursors设置为非0值时,pga的cache list长度为session_cached_cursors值的大小,同时pga cache list将会保留一份拷贝,这时候即使sga中的cursor关闭的时候它相关的library cache handle始终被加了null mode lock,当shared pool空间紧张时library cache handle始终将会被保留在shared pool中,而新的应用访问这个cursor的时候会直接去自己的pga cache list里面搜索。
1 > opened cursors current (当前单个session打开的cursors数量)
2 > parse count (hard) (当前session硬解析次数)
3 > parse count (total) (当前session解析总次数)
4 > session cursor cache count (设置session_cached_cursors参数后,"相同"sql被解析3次后被cache在sessioncursor cache中的数量
5 > session cursor cache hits (软软解析的次数 a "softer" soft parse)
6 > 手工计算一下软解析次数parse count (total) - session cursor cache hits - parse count (hard)= parse count(soft)
如何正确设置session_cached_cursors参数
正确设置open_cursors和'session_cached_cursors' 可以减少sql解析,提高系统性能,那么,如何正确设置'session_cached_cursors'这个参数呢?我们可以把握下面的原则:
1、'session_cached_cursors'数量要小于open_cursors,设置方法:
SQL> show parameter cursors
NAME TYPE VALUE
------------------------------------ ----------- ----------
open_cursors integer 300
session_cached_cursors integer 20
SQL> alter system set open_cursors=1500 scope=both;
System altered.
SQL> alter system set session_cached_cursors=1000 scope=spfile;
System altered.
open_cursors:该参数含义是同一个session同时打开最多在使用的游标数。
在Oracle10.2.0.1.0版本中默认为300;
session_cached_cursors:session_cached_cursors 就是说的是一个session可以缓存多少个cursor,让后续相同的SQL语句不再打开游标,从而避免软解析的过程来提高性能。(绑定变量是解决硬解析的问题),软解析同硬解析一样,比较消耗资源.所以这个参数非常重要。
在Oracle10.2.0.1.0版本中默认为20
在oracle 9.2.0.1.0里修改会报下面的错,这是9i版本的一个bug,可先在init文件里改好,再修改spfile文件。
SQL> alter system set session_cached_cursors=20 scope=spfile;
ORA-02096: 此选项的指定初始化参数不可修改
2、要考虑共享池的大小
3、使用下面的sql判断'session_cached_cursors' 的使用情况。如果使用率为100%则增大这个参数值。
SELECT 'session_cached_cursors' parameter,
lpad(VALUE, 5) VALUE,
decode(VALUE, 0, ' n/a', to_char(100 * used / VALUE, '990') || '%') usage
FROM (SELECT MAX(s.VALUE) used
FROM v$statname n, v$sesstat s
WHERE n.NAME = 'session cursor cache count'
AND s.statistic# = n.statistic#),
(SELECT VALUE FROM v$parameter WHERE NAME = 'session_cached_cursors')
UNION ALL
SELECT 'open_cursors',
lpad(VALUE, 5),
to_char(100 * used / VALUE, '990') || '%'
FROM (SELECT MAX(SUM(s.VALUE)) used
FROM v$statname n, v$sesstat s
WHERE n.NAME IN
('opened cursors current', 'session cursor cache count')
AND s.statistic# = n.statistic#
GROUP BY s.sid),
(SELECT VALUE FROM v$parameter WHERE NAME = 'open_cursors')
4、调整参数后进行测试。
使用session cursor caching功能后,与soft parsing基本做相同的工作,但因为减少检索库高速缓冲区的时间,因此有助于减少library cache 锁存器争用。Session cursor caching 功能上一个注意事项是此功能只在会话级上有效。因此每次执行 sql 过程中,如果要进行logon和logoff时,虽然使用此项功能但是并不能从中受益。所以应该尽量利用连接池技术,维持会话连接,这样才有助于提升性能。
整理自网络