经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库运维 » Oracle » 查看文章
Oracle 缓存命中率问题一则(里面有个问题咨询大佬们)
来源:cnblogs  作者:思则有备  时间:2018/10/18 8:53:37  对本文有异议

近日,核心数据库频繁抱出数据库缓存命中率过低,于是开始进行排查。

1.监控软件告警信息

2.抓取告警时间段内的awr报告进行分析

3.execute与parse命中率过低,说明分析(硬解析与软解析)的比例比较大,快速解析较少。

涉及到session_cached_cursors和open_cursors参数的调整:

open_cursors:该参数含义是同一个session同时打开最多在使用的游标数。在Oracle10.2.0.1.0版本中默认为300。

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

现在需要改大这个参数,以便于进行更多的快速解析,这样可以省去打开一个新的 session cursor和关闭一个现有session cursor所需要消耗的资源和时间。

4.使用下面的sql判断'session_cached_cursors'  的使用情况。如果使用率为100%则增大这个参数值。

  1. select 'session_cached_cursors' parameter,
  2. lpad(value, 5) value,
  3. decode(value, 0, ' n/a', to_char(100 * used / value, '990') || '%') usage
  4. from (select max(s.value) used
  5. from v$statname n, v$sesstat s
  6. where n.name = 'session cursor cache count'
  7. and s.statistic# = n.statistic#),
  8. (select value from v$parameter where name = 'session_cached_cursors')
  9. union all
  10. select 'open_cursors',
  11. lpad(value, 5),
  12. to_char(100 * used / value, '990') || '%'
  13. from (select max(sum(s.value)) used
  14. from v$statname n, v$sesstat s
  15. where n.name in
  16. ('opened cursors current', 'session cursor cache count')
  17. and s.statistic# = n.statistic#
  18. group by s.sid),
  19. (select value from v$parameter where name = 'open_cursors');

 

查询结果:

  1. PARAMETER VALUE USAGE
  2. ---------------------- -------------------- -----
  3. session_cached_cursors 50 144%
  4. open_cursors 300 25%

由以上查询可以看出,session_cached_cursors使用率已经高达 144%。可以推断出,目前参数 session_cached_cursors 配置是不合理的。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

再次验证session_cached_cursors 配置是否合理:

  1. SQL> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%cursor%';
  2. NAME VALUE
  3. ---------------------------------------------------------------- ----------
  4. opened cursors cumulative 4933498
  5. opened cursors current 320
  6. pinned cursors current 67
  7. session cursor cache hits 3878621
  8. session cursor cache count 1319545
  9. cursor reload failures 372
  10. cursor authentications 9323
  11.  
  12. 7 rows selected.
  13. SQL> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%parse%';
  14. NAME VALUE
  15. ---------------------------------------------------------------- ----------
  16. ADG parselock X get attempts 0
  17. ADG parselock X get successes 0
  18. parse time cpu 207094
  19. parse time elapsed 483163
  20. parse count (total) 3883754
  21. parse count (hard) 39295
  22. parse count (failures) 3106
  23. parse count (describe) 294
  24.  
  25. 8 rows selected.

 

session cursor cache hits就是系统在高速缓存区中找到相应cursors的次数,parse count(total)就是总的解析次数,二者比值越高,性能越好。如果比例比较低,并且有较多剩余内存的话,可以考虑加大该参数。

  1. SQL> select 3878621/3883754*100 from dual;
  2. 3878621/3883754*100
  3. -------------------
  4. 99.8678341

但是查询出来发现比值还是比较高的。

先执行:

  1. alter system set session_cached_cursors=100 scope=both;

观察效果。

 

看来在如此高的使用率之下,命中率还有如此之高,到底是为什么呢?

 

我只能这么解释,欢迎大佬来帮着解释一下,我也去翻阅资料继续查

 

 

注: session_cached_cursor是占用内存的,所以不能给太大值,之前看一个参考例子,设置为100,每个session PGA会多消耗64k,也就是说,如果此时有50个session,会消耗50*64k的内存,如果设置session_cached_cursor为50,每个session会消耗32k,同理计算总的session消耗。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号