过高SQL子游标案例分析

问题描述:

最近遇见一个问题关于单个SQL拥有过高子游标。当时接到oracle数据库报警,有200多会话一直处在active状态,insert语句非常缓慢。主机CPU达到了97%。


问题分析:

1. 查看awr报告

发现top 5等待事件排在前面的是resmgr:cpu quantum,cursor: mutex S,library cache lock。等待事件resmgr:cpu quantum应该是使用了Oracle资源隔离,cpu资源达到了瓶颈。


2. 查看具体的会话等待

发现基本上都是一个insert的SQL在等待resmgr:cpu quantum和mutex S。但是这个SQL语句只是一个简单的insert语句,类似于insert into tabname values (value1,value2,...);


3. 查看v$sql中改SQL的具体信息

发现这个sql有2000多个子游标。为什么有这么多子游标呢?可以查询视图v$sql_shared_cursor查找sql不能共享的原因。其中大部分不能共享的原因是ROLL_INVALID_MISMATCH,这个字段的值是N。


通过查阅资料metalink 557661_1,ROLL_INVALID_MISMATCH是由于调用了dbms_stats.gather_xxxx后收集了统计信息,统计信息收集后过了一段时间,当再次执行sql并解析时,将旧子游标失效,生成新的子游标,标记旧的子游标的v$sql_shared_cursor.ROLL_INVALID_MISMATCH为N。


4. 查看该SQL的表是否有统计信息收集,表的最近统计信息收集时间是问题发生的一个小时前。


问题解决:

1. 知道是统计信息导致后,决定手工flush shared pool

手工清理shared pool后,查看数据库的等待事件,发现短时间内有大量的cursor: mutex S,library cache lock等待时间,过了2分钟后这些等待事件消失。系统恢复正常。


2. 表的统计信息锁定

由于有问题SQL的表insert非常频繁,为了防止问题再次发生,先将这张表的统计信息锁住。


针对过高SQL子游标问题,oracle metalink也提供了一个脚本,

Document 438755.1 High SQL Version Counts - Script to determine reason(s)

下面是运行结果:


点击(此处)折叠或打开

  1. SQL> SELECT * FROM TABLE(version_rpt('7sx5p1ug5ag12'));
  2. COLUMN_VALUE
  3. ----------------------------------------------------------------------------------------------------
  4. Note:438755.1 Version Count Report Version 3.2.4 -- Today's Date 03-jan-17 14:32
  5. RDBMS Version :11.2.0.4.0 Host: cnsz081215 Instance 1 : d1fo007
  6. ==================================================================
  7. Addr: 0000000092F83C28 Hash_Value: 2656386082 SQL_ID 7sx5p1ug5ag12
  8. Sharable_Mem: 1499832 bytes Parses: 198 Execs:9912
  9. Stmt:
  10. 0 SELECT SPARE4 FROM SYS.OPTSTAT_HIST_CONTROL$ WHERE SNAME = :B1
  11. 1
  12. Versions Summary
  13. ----------------
  14. LANGUAGE_MISMATCH :86
  15. BIND_LENGTH_UPGRADEABLE :1
  16. Total Versions:85
  17. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  18. cursor_sharing = EXACT
  19. _cursor_obsolete_threshold = 1024 (See Note:10187168.8)
  20. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  21. Plan Hash Value Summary
  22. -----------------------
  23. Plan Hash Value Count
  24. =============== =====
  25.      1097271556 86
  26. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  27. Details for LANGUAGE_MISMATCH :
  28. No details available
  29. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  30. Details for BIND_LENGTH_UPGRADEABLE :
  31. Consolidated details for BIND* columns:
  32. BIND_MISMATCH,USER_BIND_PEEK_MISMATCH,BIND_UACS_DIFF,BIND_LENGTH_UPGRADEABLE,etc and
  33. BIND_EQUIV_FAILURE (Mislabled as ROW_LEVEL_SEC_MISMATCH BY bug 6964441 in 11gR1)
  34. from v$sql_bind_capture
  35. COUNT(*) POSITION MIN(MAX_LENGTH) MAX(MAX_LENGTH) DATATYPE BIND GRADUATION (PRECISION,SCALE)
  36. ======== ======== =============== =============== ======== =============== =================
  37.       86 1 32 128 1 Yes (,)
  38. SUM(DECODE(column,Y, 1, 0) FROM V$SQL
  39. IS_OBSOLETE IS_BIND_SENSITIVE IS_BIND_AWARE IS_SHAREABLE
  40. =========== ================= ============= ============
  41.           0 82 0 2
  42. ####
  43. To further debug Ask Oracle Support for the appropiate level LLL.
  44. alter session set events
  45.  'immediate trace name cursortrace address 2656386082, level LLL';
  46. To turn it off do use address 1, level 2147483648
  47. ================================================================
  48. 53 rows selected.
  49. SQL>

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

转载于:http://blog.itpub.net/25105315/viewspace-2131803/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值