目录
参照:
https://blog.csdn.net/Ruishine/article/details/118729526 https://blog.csdn.net/zuixinnet/article/details/9066609 https://blog.csdn.net/notbaron/article/details/78408372 https://blog.csdn.net/weixin_36053926/article/details/113327767
1、查看问题
AWR报告中Execute to Parse %:比例太低,如下所示:只有39.37%
Instance Efficiency Percentages (Target 100%)
2、解析Execute to Parse %
表示SQL语句解析后被重复执行命中率 计算公式=100*(1-Parses/Executions)
如果该值偏小,说明分析(硬解析与软解析)的比例较大,快速解析(即软软解析)较少。
Execute to parse %,该参数主要体现的是sql的执行次数与解析次数的比率。
可以把 Execute to Parse %和Soft Parse %这两个参数放在一起看。
①如果两个参数同时很低时,说明硬解析次数多,建议使用绑定变量。
②如果Soft Parse%高,而Execute to Parse %比低时(<40%),说明执行解析比率低,可以通过静态sql、动态绑定、调整session_cached_cursor参数、调整open_cursor等方法来减少软解析。
3、关于session_cached_cursors参数的调整:
(1)open_cursors:
该参数含义是同一个session同时打开最多在使用的游标数。在Oracle10.2.0.1.0版本中默认为300。
(2)session_cached_cursors:
就是说的是一个session可以缓存多少个cursor,让后续相同的SQL语句不再打开游标,从而避免软解析的过程来提高性能。
(绑定变量是解决硬解析的问题),软解析同硬解析一样,同样消耗资源.所以这个参数非常重要。在Oracle10.2.0.1.0版本中默认为20。
现在需要改大这个参数,以便于进行更多的软解析,这样可以省去open一个新的session cursor和close一个现有session cursor所需要消耗的资源和时间。
session_cached_cursor :表示一个会话中可以缓存多少个cursor。让后续相同的sql语句不在打开游标,从而避免软解析来提高性能(软解析与硬解析同样消耗资源)。
session cursor cache :用来存储关闭了的cursor。当一个cursor关闭之后,oracle会检查这个cursor的request次数是否超过3次,如果超过了三次,就会放入session cursor cache,这样在下次parse的时候,就可以从session cursor cache中找到这个statement, session cursor cache的管理也是使用LRU。
session_cached_cursors这个参数是控制session cursor cache的大小的。session_cached_cursors定义了session cursor cache中存储的cursor的个数。这个值越大,则会消耗的内存越多
4、通过下面语句查看验证了session_cached_cursors的使用率,如果100%设置200%,说明不够用,需要增大。
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');
5、再次验证session_cached_cursors是否合理:
session_cached_cursors的值也不是越大越好,我们可以通过下面两条语句进一步验证该参数是否合理:
(1)获取session cursor cache hits 的值
SQL> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%cursor%';
(2)获取parse count (total) 的值
SQL> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%parse%';
Sessioncursor cache hits就是系统在高速缓存区中找到相应cursors的次数,parse count(total)就是总的解析次数,二者比值越高,性能越好。
如果比例比较低,并且有较多剩余内存的话,可以考虑加大该参数。
(3)通过下面的语句来判断open_cursors的大小是否合理,
SQL>SELECT MAX(A.VALUE) AS HIGHEST_OPEN_CUR, P.VALUE AS MAX_OPEN_CUR FROM V$SESSTAT A, V$STATNAME B, V$PARAMETER P WHERE A.STATISTIC# = B.STATISTIC# AND B.NAME = 'opened cursors current' AND P.NAME = 'open_cursors' GROUP BY P.VALUE;
综上所述可以确定需要加大参数session_cached_cursors来提高oracle数据库的性能,但是参数session_cached_cursors并不是越大越好,太大会引起pga缓存碎片,消耗内存,然后session cursor cache的管理也是使用LRU。