参数含义

  • open_cursors:每个session(会话)最多能同时打开cursor(游标)数

  • session_cached_cursor:每个session(会话)最多可以缓存已关闭cursor(游标)数

SQL> show parameter open_cursors           --每个session 最多能同时打开cursor数NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
open_cursors                         integer     3000
SQL> show parameter session_cached_cursor  --每个session 最多能缓存已关闭cursor数NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
session_cached_cursors               integer     50
SQL> select count(*) from v$open_cursor;  --当前时刻实例打开的cursor数COUNT(*)----------108

参数作用

若要理解参数open_cursors和session_cached_cursor的作用,最好先弄清楚oracle是如何执行每个sql语句的。

通过上图,可以看出两点:

  • 两个参数之间没有任何关系,相互之间不会有任何影响。
  • 两个参数有着相同的作用:让后续相同的sql语句不再打开游标,从而避免软解析过程来提供应用程序的效率。

参数设置

Open_cursors设置

  • 如果Open_cursors设置太小,对系统性能不会有明显改善,还可能触发ORA-O1000:m~imum open CUrsOrs exceeded.的错误。

  • 如果设置太大,则无端消耗系统内存。

我们可以通过如下的sql语句查看你的设置是否合理:

SELECT MAX(A.VALUE) HIGHEST_OPEN_CUR, C.VALUE MAX_OPEN_CUR
FROM V$SESSTAT A, V$STATNAME B, V$PARAMETER C
WHERE A.STATISTIC# = B.STATISTIC#
AND B.NAME = 'opened cursors current'
AND C.NAME = 'open_cursors'
GROUP BY C.VALUE;


HIGHEST_ OPEN CUR是实际打开的cursors 的最大值,MAX_OPEN_ CUR是参数Open_cursors的设定值,如果二者太接近,甚至触发ORA一01000错误,那么你就应该调大参数Open_cursors的设定值。

如果问题依旧没有解决,盲目增大Open_cursors也是不对的,这个时候需要检查应用程序的代码是否合理,比如说应用程序是否打开了游标,却没有在它完成工作后没有及时关闭。

以下语句可以帮助你确定导致游标漏出的会话:

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 curent';

session_cached_cursors设置

session_cached_cursors的值也不是越大越好,我们可以通过下面两条语句得出合理的设置。

 SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%cursor%';

SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%parse%';

  • session cursor cache hits:系统在高速缓存区中找到相应cursors的次数

  • parse count(total):总解析次数

二者比值越高,性能越好。如果比例比较低,并且有较多剩余内存的话,可以考虑加大该参数。

使用下面的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');


当我们执行一条 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 参数限制了在 PGA 内 session cursor cache list 的长度,session cursor cache list是一条双向的 LRU 链表,当一个 session 打算关闭一个 cursor 时,如果这个 cursor 的 parse count 超过3次,那么这个 cursor 将会被加到 session cursor cache list 的 MRU 端。当一个 session 打算 parse 一个 sql 时,它会先去 PGA 内搜索 session cursor cache list,如果找到那么会把这个 cursor 脱离 list,然后当关闭的时候再把这个 cursor 加到 MRU 端。session_cached_cursor 提供了快速软分析的功能,提供了比 soft parse 更高的性能。

OPEN_CURSORS是一个十分有趣的参数,经常有DBA发现自己的系统中的OPEN CURSORS十分大。我们看一个例子:

SQL>select sid,value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and name='opened cursors current' order by 2;SID      VALUE---------- ----------5430         933527         954055         964090         972012         981819         985349        1021684        1031741        1164308        1691970        1701369        1814208        184887        2145215        2143518        214868        2141770        2154050        2151809        2313010        235762        237731        4714013       10662648       11522255       11722322       2620

前面我们已经查询出该系统的OPEN_CURSORS参数设置为3000,而会话中当前打开CURSOR最大的会话居然达到了2620。

在一般人的眼里,CURSOR使用后就关闭了,OPENED CURSORS的数量应该不会太多,难道应用程序出现了CURSOR泄漏,有些应用使用了CURSOR没有关闭?

实际上我们对OPEN CURSOR的概念一直存在误解。认为只有正在FETCH的CURSOR是OPEN状态的,而一旦FETCH结束,CLOSE CURSOR后,CURSOR就处于关闭状态了。因此一个会话中OPEN状态的CURSOR数量应该很少。事实上不是这样的,某些CURSOR在程序中是已经CLOSE了,但是Oracle 为了提高CURSOR的性能,会对其进行缓冲,这些缓冲的CURSOR,在程序中的关闭只是一个软关闭,事实上,在会话中并未关闭,而是放在一个CURSOR缓冲区中。

在Oracle 9.2.0.5之前,OPEN_CURSORS参数的作用是双重的,一方面是限制一个会话打开的CURSORS的总量。另外一方面,OPEN_CURSORS参数也作为PL/SQL CURSOR的缓冲。在PL/SQL中,如果某个CURSOR关闭了,这个CURSOR不会马上硬关闭,而是首先保存在CURSOR缓冲中。如果这个会话当前打开的CURSOR数量还没有达到OPEN_CURSORS参数的值,那么就可以先保持OPEN状态。如果当前打开的CURSOR数量已经达到了OPEN_CURSORS参数的限制,那么首先会关闭一个被缓冲的,实际当时并未打开的CURSOR。如果缓冲池中的所有CURSOR都是实际打开的,那么就会报ORA-1000,“maximum open cursors exceeded”。

Oracle 9.2.0.5以后,OPEN_CURSORS参数不再承担PL/SQL缓冲的工作,PL/SQL中的SQL也可以使用SESSION_CACHED_CURSORS的会话缓冲了。这个参数就成为了一个纯粹的限制。

虽然如此,OPEN_CURSORS参数仍然和CURSOR的缓冲机制密切相关,因为这个参数限制了当前某个会话打开CURSOR的最大值。设置一个较大的OPEN_CURSORS参数,可以避免出现ORA-1000,同时也可以让会话缓冲更多的CURSOR,改善SQL解析的性能。不过这个参数设置的较大会占用较大的PGA空间,消耗一定的物理内存。因此这个参数也不是设置的越大越好,一般的OLTP系统中,1000-3000就足够了。在共享服务器模式的系统中,这个参数的设置要略微保守一些,因为这个参数越大,占用的SGA空间也就越大。

另外要注意的是,从Oracle 9.0开始,这个参数就已经是动态的了,可以随时动态调整。

参考:
https://blog.csdn.net/zq9017197/article/details/7345352/
https://www.cnblogs.com/lipera/p/6214443.html

oracle参数open_cursors和session_cached_cursor详解相关推荐

  1. oracle参数open_cursors和session_cached_cursor详解!

    原文地址:https://blog.csdn.net/zq9017197/article/details/7345352 [sql] view plain copy SQL> show para ...

  2. oracle rac 环境配置文件,学习笔记:Oracle RAC spfile参数文件配置案例详解

    天萃荷净 rac中的spfile探讨,记录一下Oracle RAC搭建完成后关于spfile参数文件的配置案例,与更改RAC环境中参数文件的方法 今天朋友的的rac,因为被同事做数据库升级,分别在两个 ...

  3. oracle 挖掘日志,Oracle 日志挖掘(LogMiner)使用详解

    Logminer依赖于2个包:DBMS_LOGMNR和DBMS_LOGMNR_D,Oracle 11g默认已安装 Logminer 基本使用步骤 <1>. Specify a LogMin ...

  4. mysql启动参数(/etc/my.cnf)详解汇总

    mysql启动参数(/etc/my.cnf)详解汇总 MYSQL–my.cnf配置中文详解 basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = ...

  5. oracle select执行顺序,oracle select执行顺序的详解

    oracle select执行顺序的详解 SQL Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子 ...

  6. exp参数feedback_exp/imp命令详解

    ORACLE EXP/IMP的使用详解 作者:eclipse 导入/导出是ORACLE幸存的最古老的两个命令行工具,其实我 从来不认为Exp/Imp是一种好的备份方式,正确的说法是Exp/Imp只能是 ...

  7. 删除oracle数据库的三种方法,oracle数据库的删除方法详解

    oracle数据库的删除方法详解 1.图形界面删除 练习之前记得创建快照 执行命令之前要保证数据库属于open状态 SQL> alter database open; [oracle@local ...

  8. ORACLE的索引和约束详解数据库

    ORACLE的索引和约束详解数据库 Oracle的约束 * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段, 必须在表级定义约束 * 在定义 ...

  9. Oracle之DBMS_SQL包用法详解

    Oracle之DBMS_SQL包用法详解 原文  http://zhangzhongjie.iteye.com/blog/1948093 通常运用 DBMS_SQL 包一般分为 如下 几步: 1. o ...

最新文章

  1. 对称加密DES和TripleDES
  2. c# 自定义文件关联程序
  3. 杯具,丢失了一部分邮件
  4. jquery 导航栏目
  5. RabbitMq--1
  6. linux 如何查看应用程序进程号、端口
  7. 剑指offer 调整数组顺序使奇数位于偶数前面
  8. N次剩余(详解+例题+代码)
  9. mysql 优化配置参数(my.cnf)
  10. 深度学习笔记(11) 超参数调试
  11. python json转dict(dict转json)
  12. EJB 开发环境与入门实例
  13. Git使用方法(三)-小技巧篇
  14. 主流开源 BI 产品对比
  15. word2vec中的数学原理详解
  16. c纳秒级计时器_C#中的高精度计时方法(纳秒级别计时)
  17. 百鸡问题扩展-N鸡问题
  18. java连接 mdx,olap4j连接sap hana的xmla服务mdx查询报错【已解决】
  19. cdecl函数返回值传参方式
  20. 影视并购,是谁写的万能故事大纲?

热门文章

  1. 未将对象引用到对象的实例
  2. HTML - CSS - JavaScript
  3. HTML JavaScript
  4. 逆向工程实验——pre9(可执行文件的加密MD5碰撞lab)
  5. 【无标题】黑炫酷的监控界面,实际上是用了什么开源工具?
  6. php+sqlserver之如何连接sqlserver数据库
  7. 软件测试常用的工具都在这里了
  8. 什么是爬电距离?宽爬电距离光耦为什么越来越受大家青睐?
  9. 疫情大考之后 企业数字化转型或将出现报复性增长
  10. FPGA——1位全加器和4位全加器的实现