open_cursors: 该参数的含义是一个session同时打开最多在使用的游标数
session_cached_cursors: 说的是一个session最多可以缓存多少个cursor, 让后续的SQL语句不再打开游标,从而避免软解析的过程来提高性能。
软解析与硬解析都比较耗费资源。
以下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。
sesseion_cached_cursor限制了在PGA内session cursor cache list的长度,session cursor cache list是一条双向的LRU(Least Recently Used) 链表,当一个session打算关闭一个cursor时,如果这个cursor的parse count超过3次,那么这个cursor将会被加到session cursor cache list的MRU端(Most Recently Used)。当一个session打算parse一个SQL时,它会先去PGA内搜索session cursor cache list, 如果找到那么会把这个cursor脱离list, 然后当关闭时再把这个cursor加到MRU端。session_cached_cursor提供了快速软解析的功能,提供了比soft parse更高的性能。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8520577/viewspace-768892/
,如需转载,请注明出处,否则将追究法律责任。