继续整理关于游标 解析 绑定变量。这里说下几个参数,里面内容有点深,自己也是迷迷糊糊的!
Oracle 10G下
SQL> show parameter cursor;
NAME TYPE VALUE
cursor_sharing string EXACT
cursor_space_for_time boolean FALSE
open_cursors integer 300
session_cached_cursors integer 20
session_cached_cursors:
一个sql语句会首先在uga中缓存区存放与之关联的游标,然后打开创建游标 解析游标 执行游标 返回游标 关闭游标等。而一旦关闭这个session,这个uga中相关联的session cursor就被释放了。而session_cached_cursors参数标识的是一个session可以缓存多个cursor数量,既是存储在pga的sql语句游标的总数量,从而实现后续相同sql的软软解析。
软软解析:
Session cursor cache是一块内存区域,存储关闭了cursor,当一个cursor关闭之后,oracle检查此cursor的请求是否超过三次,如果超过三次就会放入session cache cursor内存区域中,下次在parse的时候可以从session cursor cache直接调用,从而实现软软解析(session cache cursor的管理也是使用lRU算法)
而session_cached_cursors参数也就是session缓存的cursor数量,控制了session cursor cache的大小,则值越大,相应的内存消耗也越大。
SQL> select name,value from v$sysstat where name like '%cursor%';
NAME VALUE
---------------------------------------------------------------- ----------
opened cursors cumulative 28899
opened cursors current 46
session cursor cache hits 21217
session cursor cache count 2865
cursor authentications 485
其中的session cursor cache hits就是软软解析的次数。
这里摘要下http://www.cnblogs.com/rootq/archive/2009/08/27/1554748.html的对软软解析的解释:
设置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里面搜索
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29312249/viewspace-1354614/ ,如需转载,请注明出处,否则将追究法律责任。