关于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
- ------------------------------------ ----------- -----------------------
- open_cursors integer 300
- session_cached_cursors integer 20
- SQL>
- alter system set open_cursors=1500 scope=both;
- alter system set session_cached_cursors=1000 scope=spfile; (初始化文件使用了spfile)
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');
二、下面是一篇关于v$open_cursor与session_cached_cursor文件章,引用一下:
v$open_cursor与session_cached_cursor
v$open_cursor是oracle提供的一张查看每个session打开过的cursor的视图,它的表结构如下
- SQL> desc v$open_cursor
- Name Null? Type
- ----------------------------------------------------- -------- ------------------------------------
- SADDR RAW(4)
- SID NUMBER
- USER_NAME VARCHAR2(30)
- ADDRESS RAW(4)
- HASH_VALUE NUMBER
- SQL_TEXT VARCHAR2(60)
当我们执行一条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更高的性能.
下面做个实验来证明以上这些理论
- SQL> select distinct sid from v$mystat;
- SID
- ----------
- 12
- SQL> show parameter session_cached_cursors
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- session_cached_cursors integer 0
这是设置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
- -------- ---------- ------------------------------ -------- ---------- ------------------------------------------------------------
- 95D5AFCC 12 TAOBAO 99DA7F20 745629022 select distinct sid from v$mystat
能在v$open_cursor里看到这条sql
执行下一条语句
- SQL> select owner from test where rownum=1;
- OWNER
- ------------------------------
- SYS
在来看v$open_cursor有什么变化
SQL> /
- SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT
- -------- ---------- ------------------------------ -------- ---------- ------------------------------------------------------------
- 95D5AFCC 12 TAOBAO 99C9AEF8 608211958 select owner from test where rownum=1
可以看到语句变了,来看看current open cursor和session cached cursor的数目
- SQL> select sid,n.name,s.value used
- 2 from
- 3 sys.v_$statname n,
- 4 sys.v_$sesstat s
- 5 where
- 6 n.name in ('opened cursors current', 'session cursor cache count') and
- 7 s.statistic# = n.statistic#
- 8 and sid=12;
- SID NAME USED
- ---------- ---------------------------------------------------------------- ----------
- 12 opened cursors current 1
- 12 session cursor cache count 0
我们来把session_cached_cursors修改成1
- SQL> alter session set session_cached_cursors=1;
- Session altered.
再执行上面的语句
- SQL> select owner from test where rownum=1;
- OWNER
- ------------------------------
- SYS
看看v$open_cursor
- SQL> select * from v$open_cursor where sid=12;
- SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT
- -------- ---------- ------------------------------ -------- ---------- ------------------------------------------------------------
- 95D5AFCC 12 TAOBAO 99C9AEF8 608211958 select owner from test where rownum=1
此处执行3次 select * from v$open_cursor where sid=12,oracle进行了3次soft parse
- SQL> select owner from test where rownum=1;
- OWNER
- ------------------------------
- SYS
- SQL> select owner from test where rownum=1;
- OWNER
- ------------------------------
- SYS
然后再执行
- SQL> select distinct sid from v$mystat;
- SID
- ----------
- 12
再来看看v$open_cursor有什么变化
- SQL> /
- SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT
- -------- ---------- ------------------------------ -------- ---------- ------------------------------------------------------------
- 95D5AFCC 12 TAOBAO 99C9AEF8 608211958 select owner from test where rownum=1
- 95D5AFCC 12 TAOBAO 99DA7F20 745629022 select distinct sid from v$mystat
v$open_cursor有了两条记录,再看一下current open cursor和session cached cursor的数目
- SQL> select sid,n.name,s.value used
- 2 from
- 3 sys.v_$statname n,
- 4 sys.v_$sesstat s
- 5 where
- 6 n.name in ('opened cursors current', 'session cursor cache count') and
- 7 s.statistic# = n.statistic#
- 8 and sid=12;
- SID NAME USED
- ---------- ---------------------------------------------------------------- ----------
- 12 opened cursors current 1
- 12 session cursor cache count 1
果然有一句sql进了session cursor cache,"select owner from test where rownum=1"这个sql相关的cursor就被cache起来了.
再执行一条新的语句
- SQL> select owner from test where rownum<2;
- OWNER
- ------------------------------
- SYS
看一下v$open_cursor
- SQL> select * from v$open_cursor where sid=12;
- SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT
- -------- ---------- ------------------------------ -------- ---------- ------------------------------------------------------------
- 95D5AFCC 12 TAOBAO 99CA4FFC 2584499260 select owner from test where rownum<2
- 95D5AFCC 12 TAOBAO 99C9AEF8 608211958 select owner from test where rownum=1
可以看到上一次的"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
- SQL> select distinct sid from v$mystat;
- SID
- ----------
- 12
- SQL> select distinct sid from v$mystat;
- SID
- ----------
- 12
- SQL> select distinct sid from v$mystat;
- SID
- ----------
- 12
然后再运行select owner from test where rownum<2
- SQL> select owner from test where rownum<2;
- OWNER
- ------------------------------
- SYS
再去查看v$open_cursor
- SQL> select * from v$open_cursor where sid=12;
- SADDR SID USER_NAME ADDRESS HASH_VALUE SQL_TEXT
- -------- ---------- ------------------------------ -------- ---------- ------------------------------------------------------------
- 95D5AFCC 12 TAOBAO 99C6C628 1755089113 select owner from test where rownum<2
- 95D5AFCC 12 TAOBAO 99DA7F20 745629022 select distinct sid from v$mystat
发现原来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
- -------- ---------- ------------------------------ -------- ---------- ------------------------------------------------------------
- 95D5AFCC 12 TAOBAO 99CA4FFC 2584499260 select owner from test where rownum<2
- 95D5AFCC 12 TAOBAO 99C9AEF8 608211958 select owner from test where rownum=1
- 95D5AFCC 12 TAOBAO 99DA7F20 745629022 select distinct sid from v$mystat
可以看到现在有3个cursor,看一下current open cursor和session cached cursor的数目
- SQL> select sid,n.name,s.value used
- 2 from
- 3 sys.v_$statname n,
- 4 sys.v_$sesstat s
- 5 where
- 6 n.name in ('opened cursors current', 'session cursor cache count') and
- 7 s.statistic# = n.statistic#
- 8 and sid=12;
- SID NAME USED
- ---------- ---------------------------------------------------------------- ----------
- 12 opened cursors current 1
- 12 session cursor cache count 2
这下有2个cached cursor,一个current open cursor.
从这个实验我们可以清楚得看到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等参数搭配好.
关于open_cursors和session_cached_cursors的参数值(转)的更多相关文章
- Oracle查看 open_cursors 和 session_cached_cursors
本文转自 http://blog.itpub.net/25583515/viewspace-2152997/ 查看当前session已使用的最大open cursor数 和cached cursor数 ...
- Database Initialization Parameters for Oracle E-Business Suite Release 12 (文档 ID 396009.1)
In This Document Section 1: Common Database Initialization Parameters For All Releases Section 2: Re ...
- Database Initialization Parameters for Oracle E-Business Suite Release 12
In This Document Section 1: Common Database Initialization Parameters For All Releases Section 2: Re ...
- EBS R12安装升级(FRESH)(五)
7.4.5 用DBUA升级 Database Upgrade Assistant提供图形界面进行升级. 将zysong.ttf复制到 /u01/oracle/TEST/db/tech_st/11.2. ...
- oracle参数open_cursors和session_cached_cursor详解!
SQL> show parameter open_cursors --每个session(会话)最多能同时打开多少个cursor(游标) NAME ...
- oracle数据库 参数open_cursors和session_cached_cursor详解!
open_cursors 每个session(会话)最多能同时打开多少个cursor(游标) session_cached_cursor 每个session(会话)最多可以缓存多少个关闭掉的curso ...
- [20180822]session_cached_cursors与子游标堆0.txt
[20180822]session_cached_cursors与子游标堆0.txt --//前几天测试刷新共享池与父子游标的问题,--//链接: http://blog.itpub.net/2672 ...
- Oracle 用Drapper进行like模糊传参查询需要在参数值前后带%符合
Oracle 用Drapper进行like模糊传参查询需要在参数值前后带%符合 string sqlstr="select * from tblname where name like ...
- 解析URL 获取某一个参数值
/** * 解析URL 获取某一个参数值 * * @param name 需要获取的字段 * @param webaddress URL * * @return 返回的参数对应的 value */ - ...
随机推荐
- WebGL编程指南案例解析之纹理叠加
var vShader = ` attribute vec4 a_Position; attribute vec2 a_TexCoord; varying vec2 v_TexCoord; void ...
- HDU 1589 Stars Couple(计算几何求二维平面的最近点对和最远点对)
Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- Ubuntu16.04怎样安装Python3.6
Ubuntu16.04默认安装了Python2.7和3.5 请注意,系统自带的python千万不能卸载! 输入命令python
- shell 脚本实战笔记(9)--linux自动批量添加用户
前言: 添加linux用户帐号,这个相对简单, 在面对集群, 许多机器的时候, 我们该如何去做和实现? 这篇短文, 简单讲解一些思路, 尽可能地涉及周边的一些知识点. 不光是运维人员会面临这个问题, ...
- HDU 2647:Reward(拓扑排序+队列)
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- Fire Game 双向bfs
Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns) ...
- 计算n^k的开头三位和末尾三位(fmod(double x,double y)函数的引入)
C 库函数 double fmod(double x, double y) 返回 x 除以 y 的余数. 所以fmod(x,1)得到的就是小数部分的值(如fmod(3.35,1)==0.35) htt ...
- 【mysql】修改数据时候,抛出safe mode相关错误,处理方法
在mysql5中,可以设置safe mode,比如在一个更新语句中 UPDATE table_name SET bDeleted=0; 执行时会错误,报: You are using safe upd ...
- LeetCode Pascal's Triangle && Pascal's Triangle II Python
Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given ...
- 使用MVC5的Entity Framework 6入门 ---- 系列教程
使用MVC5的Entity Framework 6入门(十二)——为ASP.NET MVC应用程序使用高级功能 为ASP.NET MVC应用程序使用高级功能这是微软官方教程Getting Starte ...