Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

5

积分

1

好友

4

主题
1#
发表于 2013-3-31 10:20:05 | 查看: 6006| 回复: 14
Redhat Linux 5 X64
11.2.0.3
发现一个比较怪异的现象:
  1. scott@DEX11g> select m.*, n.NAME
  2.   2    from v$mystat m, v$statname n
  3.   3   where m.STATISTIC# = n.STATISTIC#
  4.   4     and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  5.        SID STATISTIC#      VALUE NAME
  6. ---------- ---------- ---------- ----------------------------------------------------------------
  7.         96        532        229 session cursor cache hits
  8.         96        533         42 session cursor cache count
  9.         96        583         72 parse count (total)

  10. scott@DEX11g> declare
  11.   2  c number ;
  12.   3  begin
  13.   4  for i in 1 .. 10000 loop
  14.   5  execute immediate 'select count(*) from emp' into c  ;
  15.   6  end loop ;
  16.   7  end ;
  17.   8  /

  18. PL/SQL procedure successfully completed.

  19. scott@DEX11g> select m.*, n.NAME
  20.   2    from v$mystat m, v$statname n
  21.   3   where m.STATISTIC# = n.STATISTIC#
  22.   4     and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  23.        SID STATISTIC#      VALUE NAME
  24. ---------- ---------- ---------- ----------------------------------------------------------------
  25.         96        532      10244 session cursor cache hits
  26.         96        533         45 session cursor cache count
  27.         96        583         76 parse count (total)
复制代码
对于session cursor cache hits ,parse count 不增加了(PLSQL和普通的SQL一样的现象),10g的时候不是这样的,并且对比两个版本的官方文档没有明显变化。

不知道这是个bug还是11.2.0.3重新调整了。





15#
发表于 2013-3-31 17:40:34
Stone 发表于 2013-3-31 12:19
应该是从10g以后,这个计算的情况就有变化啦。Oracle官方的文档应该是没有及时更新反映这些新的变化。另 ...

多谢兄弟!看了一下,看来官方文档上的东西也不怎么准啊。

回复 只看该作者 道具 举报

14#
发表于 2013-3-31 12:19:33
dexter 发表于 2013-3-31 11:48
感谢您的回答,对于官方文档上说的Subtract this statistic from "parse count (total)" to determine th ...

应该是从10g以后,这个计算的情况就有变化啦。Oracle官方的文档应该是没有及时更新反映这些新的变化。另外Jonathan Lewis的一篇博客中评论部分也有读者反映到这个问题,可以参考一下。

Hi Jonathan,

Can be session cursor cache hits > parse count (total)? Why?

> @sid_parses 630

CURSOR_CACHE_HITS PARSE_CALLS HARD_PARSE CURSOR_CACHE_HITS SOFT_PARSES HARD_PARSES
----------------- ----------- ---------- ----------------- ----------- -----------
            46250       35158       8064           131.55%     -54.49%      22.94%

1 fila seleccionada.

> l
  1  select
  2    cursor_cache_hits,
  3    parse_calls,
  4    hard_parse,
  5    to_char(100 * cursor_cache_hits / parse_calls, '999999999990.00' ) || '%' cursor_cache_hits,
  6    to_char(100 * (parse_calls - cursor_cache_hits - hard_parse) / parse_calls, '999990.00' ) || '%' soft_parses,
  7    to_char(100 * hard_parse / parse_calls, '999990.00' ) || '%' hard_parses
  8  from
  9    ( select value parse_calls from v$statname a, v$sesstat b where a.statistic# = b.statistic# and name = 'parse count (total)' and sid=:p1 ),
10    ( select value hard_parse  from v$statname a, v$sesstat b where a.statistic# = b.statistic# and name = 'parse count (hard)' and sid=:p1 ),
11*  ( select value cursor_cache_hits  from v$statname a, v$sesstat b where a.statistic# = b.statistic# and name = 'session cursor cache hits' and sid=:p1)
  
(:p1 = 630 )
Is there anything wrong?

I got the query from Metalink:

SCRIPT – to Gauge the Impact of the SESSION_CACHED_CURSORS Parameter
Doc ID: Note:208918.1

Comment by Joaquín González — June 4, 2008 @ 5:03 pm UTC Jun 4,2008 | Reply


Joaquín,

Thanks for the note. I think you must be running 10.2. I hadn’t noticed it before but there seems to be a new code optimisation in 10.2 (possibly 10.1) that changes the way that some cursors can be cached.

After seeing your comment, I ran a couple of quick tests that show very different behaviour between 9.2 and 10.2 – but I haven’t yet pinned down what type of action leaves the cache hits greater than the parse calls. (I did notice, though, that a simple “startup force” left the statistics for the starting session in exactly this state). I guess a detailed examination of a 10046 trace file might reveal more of what’s going on.

This means, by the way, that comments I have made in other posts about substracting ‘session cursor cache hits’ from ‘parse count (total)’ are less useful 10g than they are for earlier versions.

Comment by Jonathan Lewis — June 10, 2008 @ 10:37 am UTC Jun 10,2008 | Reply


http://jonathanlewis.wordpress.com/2007/07/03/parse-calls/

回复 只看该作者 道具 举报

13#
发表于 2013-3-31 11:48:55
Maclean Liu(刘相兵 发表于 2013-3-31 11:33
我的理解 10g以后对于execute immediate动态SQL 若session cached cursor缓存了游标地址 形成软软解析soft  ...

感谢您的回答,对于官方文档上说的Subtract this statistic from "parse count (total)" to determine the real number of parses that occurred。在这里也就不适用了。现在真正的解析次数=parse count(total)不需要减去软软解析的个数。

期待12c文档早日面世。
已有 1 人评分威望 理由
Maclean Liu(刘相兵 + 5 结贴有奖 天道酬勤 +5威望

总评分: 威望 + 5   查看全部评分

回复 只看该作者 道具 举报

12#
发表于 2013-3-31 11:33:08
我的理解 10g以后对于execute immediate动态SQL 若session cached cursor缓存了游标地址 形成软软解析soft soft parse时 , parse count(total)是不增加的, 因为 parse count(count)包括soft parse 和 hard parse, 但不包括soft soft parse 。

AWR 中的 Execute to Parse %:反应执行解析比 这个比例的公式 1-(parse count(count) /execute) ,其实一方面就是反应 软软解析的。

回复 只看该作者 道具 举报

11#
发表于 2013-3-31 11:29:35
  1. SQL> conn / as sysdba
  2. Connected.
  3. SQL> select m.*, n.NAME
  4.   2        from v$mystat m, v$statname n
  5.   3       where m.STATISTIC# = n.STATISTIC#
  6.   4         and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  7.        SID STATISTIC#      VALUE     CON_ID NAME
  8. ---------- ---------- ---------- ---------- ------------------------------
  9.          1        643        366          0 session cursor cache hits
  10.          1        644         50          0 session cursor cache count
  11.          1        694        114          0 parse count (total)

  12. SQL> show parameter session_cached

  13. NAME                                 TYPE        VALUE
  14. ------------------------------------ ----------- ------------------------------
  15. session_cached_cursors               integer     50
  16. SQL> conn / as sysdba
  17. Connected.
  18. SQL> select m.*, n.NAME
  19.   2        from v$mystat m, v$statname n
  20.   3       where m.STATISTIC# = n.STATISTIC#
  21.   4         and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  22.        SID STATISTIC#      VALUE     CON_ID NAME
  23. ---------- ---------- ---------- ---------- ------------------------------
  24.          1        643          0          0 session cursor cache hits
  25.          1        644          1          0 session cursor cache count
  26.          1        694          3          0 parse count (total)

  27. SQL>    declare
  28.   2      c number ;
  29.   3      begin
  30.   4      for i in 1 .. 10000 loop
  31.   5      execute immediate 'select count(*) from mac_test' into c  ;
  32.   6      end loop ;
  33.   7      end ;
  34.   8  /

  35. PL/SQL procedure successfully completed.

  36. SQL> select m.*, n.NAME
  37.   2        from v$mystat m, v$statname n
  38.   3       where m.STATISTIC# = n.STATISTIC#
  39.   4         and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  40.        SID STATISTIC#      VALUE     CON_ID NAME
  41. ---------- ---------- ---------- ---------- ------------------------------
  42.          1        643      10000          0 session cursor cache hits
  43.          1        644          3          0 session cursor cache count
  44.          1        694          7          0 parse count (total)
复制代码
以上是12c中的测试结果

回复 只看该作者 道具 举报

10#
发表于 2013-3-31 11:24:02
为什么不应该呢?

回复 只看该作者 道具 举报

9#
发表于 2013-3-31 11:22:08
Maclean Liu(刘相兵 发表于 2013-3-31 11:05

11g里面对于session cursor cache hints的描述是否和实际情况有冲突?
session cursor cache hints是不应该大于parse count (total)的。

回复 只看该作者 道具 举报

8#
发表于 2013-3-31 11:05:57
  1. SQL> select * from v$version;

  2. BANNER
  3. ----------------------------------------------------------------
  4. Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
  5. PL/SQL Release 10.2.0.5.0 - Production
  6. CORE    10.2.0.5.0      Production
  7. TNS for Linux: Version 10.2.0.5.0 - Production
  8. NLSRTL Version 10.2.0.5.0 - Production

  9. SQL> show parameter session_cache

  10. NAME                                 TYPE        VALUE
  11. ------------------------------------ ----------- ------------------------------
  12. session_cached_cursors               integer     20



  13.        SID STATISTIC#      VALUE NAME
  14. ---------- ---------- ---------- ------------------------------
  15.        141        295          0 session cursor cache hits
  16.        141        296          3 session cursor cache count
  17.        141        346         11 parse count (total)

  18. SQL>    declare
  19.   2      c number ;
  20.   3      begin
  21.   4      for i in 1 .. 10000 loop
  22.   5      execute immediate 'select count(*) from sys.obj$' into c  ;
  23.   6      end loop ;
  24.   7      end ;
  25.   8  /

  26. PL/SQL procedure successfully completed.

  27. SQL> select m.*, n.NAME
  28.   2        from v$mystat m, v$statname n
  29.   3       where m.STATISTIC# = n.STATISTIC#
  30.   4         and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  31.        SID STATISTIC#      VALUE NAME
  32. ---------- ---------- ---------- ------------------------------
  33.        141        295          1 session cursor cache hits
  34.        141        296          5 session cursor cache count
  35.        141        346         14 parse count (total)
复制代码

回复 只看该作者 道具 举报

7#
发表于 2013-3-31 10:55:04
psufnxk2000 发表于 2013-3-31 10:51
show parameter session_cached_cur
10.2里这个参数 默认是0
11.2里默认是 50

两边我已经进行了修改
10g:
  1. sys@DEX10g> show parameter session_cached_cursor

  2. NAME                                 TYPE        VALUE
  3. ------------------------------------ ----------- ------------------------------
  4. session_cached_cursors               integer     100
复制代码
11g:
  1. sys@DEX11g> show parameter session_cached_cursor

  2. NAME                                 TYPE        VALUE
  3. ------------------------------------ ----------- ------------------------------
  4. session_cached_cursors               integer     100
  5. sys@DEX11g>
复制代码

回复 只看该作者 道具 举报

6#
发表于 2013-3-31 10:53:47
Maclean Liu(刘相兵 发表于 2013-3-31 10:50
不要这样测试 ,拿你上面的测试脚本到10g 中 一测便知

10g里面对于plsql里面的动态sql是不算在session cursor cache hints里面的。所以才拿普通sql做的实验。

下面是相应的11.2.0.3的
  1. scott@DEX11g> select m.*, n.NAME
  2.   2    from v$mystat m, v$statname n
  3.   3   where m.STATISTIC# = n.STATISTIC#
  4.   4     and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  5.        SID STATISTIC#      VALUE NAME
  6. ---------- ---------- ---------- ----------------------------------------------------------------
  7.         96        532      10255 session cursor cache hits
  8.         96        533          2 session cursor cache count
  9.         96        583         77 parse count (total)

  10. scott@DEX11g> select m.*, n.NAME
  11.   2    from v$mystat m, v$statname n
  12.   3   where m.STATISTIC# = n.STATISTIC#
  13.   4     and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  14.        SID STATISTIC#      VALUE NAME
  15. ---------- ---------- ---------- ----------------------------------------------------------------
  16.         96        532      10257 session cursor cache hits
  17.         96        533          2 session cursor cache count
  18.         96        583         77 parse count (total)

  19. scott@DEX11g> select m.*, n.NAME
  20.   2    from v$mystat m, v$statname n
  21.   3   where m.STATISTIC# = n.STATISTIC#
  22.   4     and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  23.        SID STATISTIC#      VALUE NAME
  24. ---------- ---------- ---------- ----------------------------------------------------------------
  25.         96        532      10259 session cursor cache hits
  26.         96        533          2 session cursor cache count
  27.         96        583         77 parse count (total)
复制代码

回复 只看该作者 道具 举报

5#
发表于 2013-3-31 10:51:11
show parameter session_cached_cur
10.2里这个参数 默认是0
11.2里默认是 50

回复 只看该作者 道具 举报

4#
发表于 2013-3-31 10:50:29
不要这样测试 ,拿你上面的测试脚本到10g 中 一测便知

回复 只看该作者 道具 举报

3#
发表于 2013-3-31 10:30:54
Maclean Liu(刘相兵 发表于 2013-3-31 10:26
我印象中  10g中  soft soft parse 就不算在这个parse count (total)里了, 但是目前没有10g的环境测试证明 ...

还是算的
  1. scott@DEX10g> select m.*, n.NAME
  2.   2    from v$mystat m, v$statname n
  3.   3   where m.STATISTIC# = n.STATISTIC#
  4.   4     and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  5.        SID STATISTIC#      VALUE NAME
  6. ---------- ---------- ---------- ----------------------------------------------------------------
  7.        144        279        160 session cursor cache hits
  8.        144        280         90 session cursor cache count
  9.        144        330        217 parse count (total)

  10. scott@DEX10g> select m.*, n.NAME
  11.   2    from v$mystat m, v$statname n
  12.   3   where m.STATISTIC# = n.STATISTIC#
  13.   4     and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  14.        SID STATISTIC#      VALUE NAME
  15. ---------- ---------- ---------- ----------------------------------------------------------------
  16.        144        279        162 session cursor cache hits
  17.        144        280         90 session cursor cache count
  18.        144        330        219 parse count (total)

  19. scott@DEX10g> select m.*, n.NAME
  20.   2    from v$mystat m, v$statname n
  21.   3   where m.STATISTIC# = n.STATISTIC#
  22.   4     and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  23.        SID STATISTIC#      VALUE NAME
  24. ---------- ---------- ---------- ----------------------------------------------------------------
  25.        144        279        164 session cursor cache hits
  26.        144        280         90 session cursor cache count
  27.        144        330        221 parse count (total)

  28. scott@DEX10g> select m.*, n.NAME
  29.   2    from v$mystat m, v$statname n
  30.   3   where m.STATISTIC# = n.STATISTIC#
  31.   4     and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;

  32.        SID STATISTIC#      VALUE NAME
  33. ---------- ---------- ---------- ----------------------------------------------------------------
  34.        144        279        166 session cursor cache hits
  35.        144        280         90 session cursor cache count
  36.        144        330        223 parse count (total)
复制代码
select m.*, n.NAME
  from v$mystat m, v$statname n
where m.STATISTIC# = n.STATISTIC#
   and (n.name in ('session cursor cache hits','session cursor cache count','parse count (total)')) ;
这条sql已经cache 到 pga中了。

官方文档中关于session cursor cache hints 有这样的描述

Number of hits in the session cursor cache. A hit means that the SQL (including recursive SQL) or PL/SQL statement did not have to be reparsed. Subtract this statistic from "parse count (total)" to determine the real number of parses that occurred.


相减变成负数了…

回复 只看该作者 道具 举报

2#
发表于 2013-3-31 10:26:48
我印象中  10g中  soft soft parse 就不算在这个parse count (total)里了, 但是目前没有10g的环境测试证明。

回复 只看该作者 道具 举报

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

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-16 13:27 , Processed in 0.057272 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569