SESSION_CACHED_CURSORS,OPEN_CURSORS,CURSOR_SHARING

SESSION_CACHED_CURSORS,就是说的是一个session可以缓存多少个cursor,让后续相同的SQL语句不再打开游标,从而避免软解析的过程来提高性能。(绑定变量是解决硬解析的问题),软解析同硬解析一样,比较消耗资源.所以这个参数非常重要。

oracle有一个概念,那就是session cursor cache,中文描述就是有一块内存区域,用来存储关闭了的cursor。当一个cursor关闭之后,oracle会检查这个cursor的request次数是否超过3次,如果超过了三次,就会放入session cursor cache,这样在下次parse的时候,就可以从session cursor cache中找到这个statement, session cursor cache的管理也是使用LRU。
h*MmQP)P'yt22308399session_cached_cursors这个参数是控制session cursor cache的大小的。session_cached_cursors定义了session cursor cache中存储的cursor的个数。这个值越大,则会消耗的内存越多。

 

检查数据库中的 OPEN_CURSORS 参数值。
L#h"~\eEo$v22308399Oracle 使用 init.ora 中的初始化参数 OPEN_CURSORS 指定一个会话一次最多可以拥有的游标数。缺省值为 50。要获得数据库中 OPEN_CURSORS 参数的值,可以使用以下查询: ITPUB个人空间Z A&Cu*R8B7t,E
SQL> show parameter open_cursors;
`L4R?4Cwr+K^_22308399NAME            T                      YPE    VALUEITPUB个人空间3G YVllcH G)H5^
------------------------------------ ----------- ---------------ITPUB个人空间5o3E)w|0fu?bd3_9c
open_cursors                         integer 1000

重要的是将 OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标。应用程序不同,该值也不同。即便会话打开的游标数未达 OPEN_CURSORS 指定的数量(即设置的值高于实际需要的值), 也不会增加系统开销。
0ll)Ag6sk8M?0L#{^8s8s22308399 获取打开的游标数。
So3b,Gb22308399下面的查询按降序显示用户“SCOTT”为每个会话打开的游标数。 ITPUB个人空间d\F5{ ^ F0yx
SQL> select o.sid, osuser, machine, count(*) num_curs
'|T*KY+TTD$K i22308399   from v$open_cursor o, v$session s
,bK:Q g;j-uL2e'J22308399   where user_name = 'SCOTT' and o.sid=s.sid
MB%aa:sU22308399   group by o.sid, osuser, machineITPUB个人空间7c,J4|I6g7{
   order by num_curs desc;ITPUB个人空间;PMi3Jn

ITPUB个人空间7ic-MQ{0oN~

EXACT 精确匹配,空格,字母大小写都严格匹配。ITPUB个人空间5G7O;HDk[8L/u0MO
SIMILAR将未使用绑定变量的语句转化为类似的使用绑定变量的SQL共享。但如果此SQL使用到了histogram(柱状图)来生成执行计划,那么就不会和类似的SQL共享了。ITPUB个人空间!o O-Xz'p:K)[
FORCE 和SIMIAR值差不多,只是如果SQL使用到了histogram也会采用和类似的SQL共享。

Oracle推荐使用SIMILAR,这样避免了一味地如force一样转换成变量形式,因为有histograms的情况下转换成变量之后就容易产生错误的执行计划,没有利用上统计信息。ITPUB个人空间V5cr2zLo9I
而exact,在没有histograms的情况下也要分别产生硬解析,这样的话,由于执行计划不会受到数据分布的影响(因为没有统计信息)重新解析是没有实质意义的。而similar则综合了两者的优点。ITPUB个人空间O"u0T7a6W

*{V h-sWJWA0如果应用程序没有使用绑定变量,而且修改应该程序的代价很大,那么有时候采用折中的方式,在Oracle上设置CURSOR_SHARING为FORCE。这样强制系统采用绑定变量。但是将参数设置为FORCE会导致很多的问题。
s8_~ J@4zY r0 ITPUB个人空间"E~+[Y"?ik%YEc
从Oracle9i开始,CURSOR_SHARING的值增加了一个SIMILAR,Oracle推荐使用SIMILAR来代替FORCE,当参数设置为SIMILAR时,Oracle不会强制将全部的变量进行绑定,而是根据一些预定义的设置进行判断。ITPUB个人空间#JE.?4m+_8Q
ITPUB个人空间nP}3o%`+X
无论是FORCE参数还是改进后的SIMILAR参数,都是解决绑定变量的替代方式,这些方式都可能带来一些bug以及很多未知的东西。只要有可能就应该通过修改程序的方法去设置绑定变量。
!|rfe ^ |wM0
X:a:VnA[Mn(z~0提示CURSOR_SHARING_EXACTITPUB个人空间 S)|U?%{8I;]1m
CURSOR_SHARING_EXACT是当cursor_sharing=smiler or cursor_sharing=force时使用, 不使用通过强制绑定bind产生的执行计划。ITPUB个人空间5b/|R*VEI-e){U

7~d.}5N8HB'Q1nn$V0使用方法如:
u!gn9Nm@b?A.L0select /*+ CURSOR_SHARING_EXACT */ from table1 where col=1;ITPUB个人空间W(NR/Z+M^5n

 

 


 

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22308399/viewspace-752008/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22308399/viewspace-752008/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值