oracle数据库 参数open_cursors和session_cached_cursor详解!

open_cursors
每个session(会话)最多能同时打开多少个cursor(游标)
session_cached_cursor
每个session(会话)最多可以缓存多少个关闭掉的cursor
SQL> show parameter open_cursors           --每个session(会话)最多能同时打开多少个cursor(游标)  

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
open_cursors                         integer     300
SQL> show parameter session_cached_cursor  --每个session(会话)最多可以缓存多少个关闭掉的cursor  

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
session_cached_cursors               integer     20  

SQL> select count(*) from v$open_cursor;  --是指当前实例的某个时刻的打开的cursor数目

  COUNT(*)
----------
       1081、open_cursors与session_cached_cursor有什么作用?open_cursors设置每个会话session最多能同时打开多少个cursor(游标)。session_cached_cursor 设定每个session(会话)最多可以缓存多少个关闭掉的cursor。我们得看看oracle如何执行每个sql语句。

通过分析上图我们可以得出

a、两个参数之间没有任何关系,相互也不会有任何影响。

b、两个参数有着相同的作用:让后续相同的sql语句不在打开游标,从而避免软解析过程来提供应用程序的效率。

2、如何正确合理设置参数的大小?
a、如果Open_cursors设置太小,对系统性能不会有明显改善,还可能触发ORA-O1000:m~imum open CUrsOrs exceeded.的错误。如果设置太大,则无端消耗系统内存。我们可以通过如下的sql语句查看你的设置是否合理:

 SQL> SELECT MAX(A.VALUE) HIGHEST_OPEN_CUR, C.VALUE MAX_OPEN_CUR
      2    FROM V$SESSTAT A, V$STATNAME B, V$PARAMETER C
      3   WHERE A.STATISTIC# = B.STATISTIC#
      4     AND B.NAME = ‘opened cursors current‘
      5     AND C.NAME = ‘open_cursors‘
      6   GROUP BY C.VALUE;  

    HIGHEST_OPEN_CUR MAX_OPEN_CUR
    ---------------- --------------------
                  28 300  HIGHEST_ OPEN CUR是实际打开cursors的最大值,MAX_OPEN_ CUR是参数Open_cursors的设定值,如果二者太接近,甚至触发eRA一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的值也不是越大越好,我们可以通过下面两条语句得出合理的设置。
SQL> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE ‘%cursor%‘;  

    NAME                                                                  VALUE
    ---------------------------------------------------------------- ----------
    opened cursors cumulative                                             15095
    opened cursors current                                                   34
    session cursor cache hits                                             12308
    session cursor cache count                                              775
    cursor authentications                                                  324  

    SQL> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE ‘%parse%‘;  

    NAME                                                                  VALUE
    ---------------------------------------------------------------- ----------
    parse time cpu                                                          332
    parse time elapsed                                                     1190
    parse count (total)                                                    9184
    parse count (hard)                                                     1031
    parse count (failures)                                                    3  session cursor cache hits就是系统在高速缓存区中找到相应cursors的次数,parse count(total)就是总的解析次数,二者比值越高,性能越好。如果比例比较低,并且有较多剩余内存的话,可以考虑加大该参数。c、使用下面的sql判断‘session_cached_cursors‘ 的使用情况。如果使用率为100%则增大这个参数值。
SQL> SELECT ‘session_cached_cursors‘ PARAMETER,
      2         LPAD(VALUE, 5) VALUE,
      3         DECODE(VALUE, 0, ‘ n/a‘, TO_CHAR(100 * USED / VALUE, ‘990‘) || ‘%‘) USAGE
      4    FROM (SELECT MAX(S.VALUE) USED
      5            FROM V$STATNAME N, V$SESSTAT S
      6           WHERE N.NAME = ‘session cursor cache count‘
      7             AND S.STATISTIC# = N.STATISTIC#),
      8         (SELECT VALUE FROM V$PARAMETER WHERE NAME = ‘session_cached_cursors‘)
      9  UNION ALL
     10  SELECT ‘open_cursors‘,
     11         LPAD(VALUE, 5),
     12         TO_CHAR(100 * USED / VALUE, ‘990‘) || ‘%‘
     13    FROM (SELECT MAX(SUM(S.VALUE)) USED
     14            FROM V$STATNAME N, V$SESSTAT S
     15           WHERE N.NAME IN
     16                 (‘opened cursors current‘, ‘session cursor cache count‘)
     17             AND S.STATISTIC# = N.STATISTIC#
     18           GROUP BY S.SID),
     19         (SELECT VALUE FROM V$PARAMETER WHERE NAME = ‘open_cursors‘);  

    PARAMETER              VALUE      USAGE
    ---------------------- ---------- -----
    session_cached_cursors    20       100%
    open_cursors             300        16%  

当我们执行一条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         93

      3527         95

      4055         96

      4090         97

      2012         98

      1819         98

      5349        102

      1684        103

      1741        116

      4308        169

      1970        170

      1369        181

      4208        184

       887        214

      5215        214

      3518        214

       868        214

      1770        215

      4050        215

      1809        231

      3010        235

       762        237

       731        471

      4013       1066

      2648       1152

      2255       1172

      2322       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开始,这个参数就已经是动态的了,可以随时动态调整。

时间: 2024-08-01 08:21:45

oracle数据库 参数open_cursors和session_cached_cursor详解!的相关文章

oracle参数open_cursors和session_cached_cursor详解!

[sql] view plaincopyprint? SQL> show parameter open_cursors           --每个session(会话)最多能同时打开多少个cursor(游标) NAME                                 TYPE        VALUE ------------------------------------ ----------- ------------------------------ open_curs

Oracle数据库入门——pctfree和pctused详解

一.建立表时候,注意PCTFREE参数的作用 PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被用于update:即:当使用一个block时,在达到pctfree之前,该block是一直可以被插入的,这个时候处在上升期. PCTUSED:是指当块里的数据低于多少百分比时,又可以重新被insert,一般默认是40,即40%,即:当数据低于40%时,又可以写入新的数据,这个时候处在下降期

oracle监听(lsnrctl)详解解读

(总结)Oracle监听服务lsnrctl参数及查询状态详解 lsnrctl命令常用参数详解: lsnrctlstart启动指定的监听器 stop关闭指定的监听器 status显示监听器的状态.status命令显示监听器是不是活动的,日志与跟踪文件的位置,监听器已经持续运行了多长时间,以及监听器所监听的任务.如下图所示: services列举监听器的服务信息,比如这些服务是否有任何专用的预生成服务器进程或与之相关的调度进程,以及每个服务已有多少连接被接受或拒绝.这种方法用来检查一个监听器是否在监

Oracle中常用的to_Char用法详解

Oracle中常用的to_Char用法详解(有FMT的详细列表) The following are number examples for the to_char function. to_char(1210.73, '9999.9') would return '1210.7' to_char(1210.73, '9,999.99') would return '1,210.73' to_char(1210.73, '$9,999.00') would return '$1,210.73'

MySQL数据库使用mysqldump导出数据详解

mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数据库使用mysqldump导出数据详解,需要的朋友一起学习吧 mysqldump是mysql用于转存储数据库的客户端程序.它主要产生一系列的SQL语句,可以封装到文件,该文件包含有所有重建您的数据库所 需要的 SQL命令如CREATE DATABASE,CREATE TABLE,INSERT等等.可

mysql数据库my.ini配置文件中文详解

mysql数据库my.ini配置文件中文详解 mysqld程序–目录和文件 basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的目录. datadir = path 从给定目录读取数据库文件. pid-file = filename 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程. socket = filen

Oracle之外键(Foreign Key)用法详解(一)

Oracle外键(Foreign Key)用法详解(一) 1.目标 演示如何在Oracle数据库中使用外键 2.什么是外键? 1)在Oracle数据库中,外键是用来实现参照完整性的方法之一.打个形象的比喻,外键是指定义外键的表的列的值必须在另一个表中出现. 2)被参照的表称之为父表(parent table),创建外键的表称之为子表(child table).子表中的外键关联了父表中的主键. 3)外键可以在创建表时定义或者通过ALTER TABLE语句创建. 3.创建表时定义外键 语法: CRE

Oracle 建表常用数据类型的详解

创建表时,必须为表的各个列指定数据类型.如果实际的数据与该列的数据类型不相匹配,则数据库会拒绝保存.如为学生指定出生日期为"1980-13-31". 在Oracle中,常见的数据类型有: 字符串:字符串分为定长类型char和变长类型varchar2. 数字:整数 number(整数位),小数 number(总长度,小数位),只写number,表示无限制. 日期:date类型,可以保存年月日时分秒. 问题:Oracle中为什么字符串类型为varchar2,它与varchar有什么关系?

mysql数据库TINYINT取值范围详解

分享下mysql中TINYINT的取值范围,很基础的一些内容. 在MySQL的数据类型中,Tinyint的取值范围是:带符号的范围是-128到127.无符号的范围是0到255(见官方<MySQL 5.1参考手册>http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#numeric-types). Tinyint占用1字节的存储空间,即8位(bit).那么Tinyint的取值范围怎么来的呢?先看无符号的情况.无符号的最小值即全部8位(b