ITPUB论坛-中国最专业的IT技术社区

 
 注册
热搜:
查看: 366|回复: 0

[原创] 查询 GV$INSTANCE 视图导致 session cursor cache count值异常大的BUG

[复制链接]
论坛徽章:
10
娜美
日期:2017-06-26 15:18:15目光如炬
日期:2018-01-14 22:00:00目光如炬
日期:2017-12-17 22:00:00目光如炬
日期:2017-11-26 22:00:00火眼金睛
日期:2017-09-30 22:00:01目光如炬
日期:2017-09-03 22:00:01火眼金睛
日期:2017-09-01 17:00:07目光如炬
日期:2017-08-27 22:00:01目光如炬
日期:2017-08-20 22:00:00火眼金睛
日期:2018-02-28 22:00:00
跳转到指定楼层
1#
发表于 2017-12-5 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunyunyi 于 2017-12-5 16:35 编辑


目前就职海天起点,服务于电力行业,致力于帮助客户解决生产过程中出现的问题,提高生产效率, 爱好书法,周易!愿结交志同道合之士!共同进步! 微信号:sunyunyi_sun

查询 GV$INSTANCE 视图导致 session cursor cache count值异常大的BUG

说明:

首先复习下关于session cursor的两个重要参数:
open_cursors 参数意思为单个session同时能以open状态存在的session cursor数量
session_cached_cursors 参数意思为单个session最大缓存状态为closed session cursor数量
需要说明的是这两个参数针对session cursor并不是shared cursor,这些信息存储在PGA中。

我们知道open_cursors 太小会导致ora-1000错误,硬性限制需要设置较大,但是session_cached_cursors 参数采用LRU算法,
也就是当链表饱和时丢弃不经常使用的session cursor,那么这个链表永远不会大于参数的设定值比如下面案例为200,但是
BUG是无处不在的,在v$sesstat 统计信息中这个值可能异常的大,当我们调整该参数时这个异常值需要忽略,
下面我们看看这个异常数字是怎么产生的。

参数值:

SQL> show parameter cursor
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- -------------
open_cursors                         integer                          1500
session_cached_cursors               integer                          200

查询session关于session cursor cache count的 统计信息

SQL>  select sc.sid,sc.value
  2  from v$sesstat sc,v$statname mc
  3  where sc.statistic# = mc.statistic#
  4        and mc.name = 'session cursor cache count'
  5  /

       SID      VALUE
---------- ----------
       337          3
       339         10
       341         42
       385          0
       386        200
       774         38
       817          0
       819        136
       820         12
       865          0
       867        160
      1347         30
      1348         13
      1393          0
      1394         41
      1395    3041508 ---这个值很离谱呀!
      1441          0
      1442        200

发现session 1395 的统计值很离谱,其他session值都小于参数最大值200,经过查询该session信息发现sql中都查询了GV$INSTANCE视图。

我们测试以下:

session 1:
select distinct sid from v$mystat
/
1253

declare
vnum number;
begin
for i in 1..500 loop
select count(*) into vnum from GV$INSTANCE;
end loop;
end;
/

session 2:
SQL> clear col
SQL> set lines 120 pages 120
SQL> col name for a28
SQL> select sc.sid,mc.name,sc.value
  2  from v$sesstat sc,v$statname mc
  3  where sc.statistic# = mc.statistic#
  4        and sc.sid = 1253
  5        and sc.value >0
  6        and mc.name = 'session cursor cache count'
  7  /

       SID NAME                              VALUE
---------- ---------------------------- ----------
      1253 session cursor cache count            8


       SID NAME                              VALUE
---------- ---------------------------- ----------
      1253 session cursor cache count            9


       SID NAME                              VALUE
---------- ---------------------------- ----------
      1253 session cursor cache count           32


       SID NAME                              VALUE
---------- ---------------------------- ----------
      1253 session cursor cache count          738


       SID NAME                              VALUE
---------- ---------------------------- ----------
      1253 session cursor cache count          930


       SID NAME                              VALUE
---------- ---------------------------- ----------
      1253 session cursor cache count         1086

       SID NAME                              VALUE
---------- ---------------------------- ----------
      1253 session cursor cache count         1236

       SID NAME                              VALUE
---------- ---------------------------- ----------
      1253 session cursor cache count         1386

       SID NAME                              VALUE
---------- ---------------------------- ----------
      1253 session cursor cache count         1527


可见查询GV$INSTANCE视图 对于session级别统计session cursor cache count信息是有BUG的!

下面这个SQL可以准确查询系统中session cursor的使用情况:

clear col
set lines 120 pages 120
col parameter for a25
col value for a15
col usage for a15
SELECT s1.INST_ID,'session_cached_cursors' PARAMETER,  
           LPAD(s2.VALUE, 5) VALUE,  
           DECODE(s2.VALUE, 0, ' n/a', TO_CHAR(100 * s1.USED / s2.VALUE, '99999999') || '%') USAGE  
      FROM (SELECT N.INST_ID,MAX(S.VALUE) USED  
              FROM GV$STATNAME N, GV$SESSTAT S ,
           (SELECT max(VALUE) m_value FROM GV$PARAMETER WHERE NAME = 'session_cached_cursors') P
              WHERE N.INST_ID = S.INST_ID
               AND N.NAME = 'session cursor cache count'  
               AND S.STATISTIC# = N.STATISTIC#
               AND s.value <=p.m_value
               group by N.INST_ID) s1,  
           (SELECT inst_id,VALUE FROM GV$PARAMETER WHERE NAME = 'session_cached_cursors') s2
      where s1.inst_id = s2.inst_id
    UNION ALL  
   SELECT p1.INST_ID,'open_cursors' PARAMETER,  
          LPAD(p2.VALUE, 5) VALUE,  
          TO_CHAR(100 * p1.USED / p2.VALUE, '9999999') || '%' USAGE
     FROM (SELECT N.INST_ID,MAX(S.VALUE) USED  
             FROM GV$STATNAME N, GV$SESSTAT S  
            WHERE N.INST_ID = S.INST_ID  
                  AND N.NAME = 'opened cursors current'
              AND S.STATISTIC# = N.STATISTIC#  
            GROUP BY N.INST_ID ) p1,  
          (SELECT INST_ID,VALUE FROM GV$PARAMETER WHERE NAME = 'open_cursors') p2
     where p1.inst_id = p2.inst_id
/


   INST_ID PARAMETER                   VALUE           USAGE
---------- ------------------------- --------------- ---------------
         1 session_cached_cursors      200                 100%
         3 session_cached_cursors      200                 100%
         2 session_cached_cursors      200                 100%
         3 open_cursors               1500                 14%
         2 open_cursors               1500                 12%
         1 open_cursors               1500                 14%


10G,11G 都存在该问题!目前MOS 没有查到该BUG 信息。








您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 |
  | | |
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表