Oracle high version count子游标过多问题定位

本文主要探讨了在优化Oracle SQL时遇到的子游标过多问题,特别是60多个子游标无法共享的情况。通过查询`v$sql_shared_cursor`视图,发现问题是由于`roll_invalid_mismatch`导致的。文章提到了Oracle的`no_invalidate`参数对统计信息失效的影响,并指出在没有硬解析和 latch 争用问题的情况下,此问题可以忽略。同时,提供了绑定执行计划和清除无效子游标的解决方案,以及脚本`version_rpt3_24.sql`用于定位原因。子游标产生的原因还包括客户端字符集、绑定变量长度、 ACS 特性、基数反馈等。
摘要由CSDN通过智能技术生成

子游标过多问题

 

      2019 4 1 日,在优化 emc sql 的时候,发现一条 sql 下面有 60 多个子游标,其实不算太多,但是出于好奇还是想看看是什么原因导致了这么多的子游标无法共享的问题。之前处理过上千个子游标的问题,定位子游标无法共享原因的方法其实比较简单。

 

l   如果子游标没有那么多,比如这里就只有 60 多个,那么就直接查询 v$sql_shared_cursor 视图,子游标没有那么多,是可以肉眼观察分析结果的。

l   如果子游标很多,比如之前碰到的上千个,那么查询视图结果太多不好分析,此时可以借助 MOS 上拿来的存储过程,帮助我们分析。

 

      select * from v$sql_shared_cursor where sql_id='bfd80zrdwa63f'; 这里采用直接查询视图定位原因的方法。

      可以看到,子游标无法共享的原因在于 roll_invalid_mismatch Oracle 在自动收集统计信息后,游标是否马上全部失效是由收集统计信息时的参数 no_invalid 控制的。该参数有 3 个值

TRUE: 不失效

FLASE: 马上失效

AUTO_INVALID:Oracle 自己决定什么时候失效。这个失效时间跟 sql 执行情况有关,也受另一个隐含参数的影响, _optimizer_invalidation_period

SQL> set line 200

SQL> col name for a30;

SQL> col value for a10;

SQL> select * from

    2  (select

    3  x.ksppinm name,

    4  y.ksppstvl value,

    5  y.ksppstdf isdefault,

    6    decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE')   ismod,

    7    decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE') isadj

    8  from

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值