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

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

0

积分

1

好友

11

主题
1#
发表于 2013-8-9 11:13:27 | 查看: 4256| 回复: 9
  1. SQL> select * from v$version;

  2. BANNER
  3. --------------------------------------------------------------------------------
  4. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
  5. PL/SQL Release 11.2.0.1.0 - Production
  6. CORE    11.2.0.1.0      Production
  7. TNS for Linux: Version 11.2.0.1.0 - Production
  8. NLSRTL Version 11.2.0.1.0 - Production
复制代码
软解析也会消耗CPU的资源,最理想的情况就是一次解析,多次执行

执行sql语句
  1. SQL> select count(*) from t;

  2.   COUNT(*)
  3. ----------
  4.          0

  5. SQL>  Select Hash_Value, Sql_Text, Parse_Calls, Executions From V$sql Where sql_text='select count(*) from t';

  6. HASH_VALUE SQL_TEXT                                 PARSE_CALLS EXECUTIONS
  7. ---------- ---------------------------------------- ----------- ----------
  8. 2763161912 select count(*) from t                             1          1
复制代码
解析和执行都是一次,当再次执行的时候
  1. SQL> select count(*) from t;

  2.   COUNT(*)
  3. ----------
  4.          0

  5. SQL>  Select Hash_Value, Sql_Text, Parse_Calls, Executions From V$sql Where sql_text='select count(*) from t';

  6. HASH_VALUE SQL_TEXT                                 PARSE_CALLS EXECUTIONS
  7. ---------- ---------------------------------------- ----------- ----------
  8. 2763161912 select count(*) from t                             2          2
复制代码
解析和执行都加了1,为什么解析数会加1?这里应该是可以直接使用刚才解析过的sql语句啊?



当我用一个pl/sql块去跑的时候,结果又不一样了
  1. SQL> begin
  2.   2  for i in 1..10000 loop
  3.   3  execute immediate 'select count(*) from t';
  4.   4  end loop;
  5.   5  end;
  6.   6  /

  7. PL/SQL procedure successfully completed.

  8. SQL>  Select Hash_Value, Sql_Text, Parse_Calls, Executions From V$sql Where sql_text='select count(*) from t';

  9. HASH_VALUE SQL_TEXT                                 PARSE_CALLS EXECUTIONS
  10. ---------- ---------------------------------------- ----------- ----------
  11. 2763161912 select count(*) from t                             2          2
  12. 2763161912 select count(*) from t                             1      10000
复制代码
这次确实是一次解析,多次执行!


请各位老师出来指导一下啊,确实没明白!
2#
发表于 2013-8-9 11:33:24
解析和执行都加了1,为什么解析数会加1?这里应该是可以直接使用刚才解析过的sql语句啊?


==>进一步阐述一下这里的逻辑

回复 只看该作者 道具 举报

3#
发表于 2013-8-9 12:02:32
我的意思是,第一次执行这条语句的时候已经进行了一次解析,当再一次执行这条sql语句的时候,我认为,不应该再去进行解析,应该直接执行就行了,所以应该就只有EXECUTIONS加1, PARSE_CALLS不应该加1才对,但是结果却是PARSE_CALLS和EXECUTIONS都加1

回复 只看该作者 道具 举报

4#
发表于 2013-8-9 12:35:12
软解析也是解析

回复 只看该作者 道具 举报

5#
发表于 2013-8-9 12:45:05
我就想不要软解析,直接execution

回复 只看该作者 道具 举报

6#
发表于 2013-8-9 13:37:20
第一次执行这条语句的时候已经进行了一次解析

==> 除非成为open cursor reuse or session cached cursor,否则第二次执行时 soft parse

你的循环例子中的 是静态绑定, 所以只解析一次

回复 只看该作者 道具 举报

7#
发表于 2013-8-9 14:07:17
本帖最后由 fiozhang 于 2013-8-9 14:28 编辑

我模拟了一下,执行5次的结果,第四次开始解析不增加,这个是什么原因?

版本:
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for 64-bit Windows: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
  1. SYS @ orcl1>create table tt (tid number);

  2. 表已创建。

  3. SYS @ orcl1>select * from tt;

  4. 未选定行

  5. SYS @ orcl1>select parse_calls,executions from v$sql where sql_text='select * from tt';

  6. PARSE_CALLS EXECUTIONS
  7. ----------- ----------
  8.           1          1

  9. SYS @ orcl1>select * from tt;

  10. 未选定行

  11. SYS @ orcl1>select parse_calls,executions from v$sql where sql_text='select * from tt';

  12. PARSE_CALLS EXECUTIONS
  13. ----------- ----------
  14.           2          2

  15. SYS @ orcl1>select * from tt;

  16. 未选定行

  17. SYS @ orcl1>select parse_calls,executions from v$sql where sql_text='select * from tt';

  18. PARSE_CALLS EXECUTIONS
  19. ----------- ----------
  20.           3          3

  21. SYS @ orcl1>select * from tt;

  22. 未选定行

  23. SYS @ orcl1>select parse_calls,executions from v$sql where sql_text='select * from tt';

  24. PARSE_CALLS EXECUTIONS
  25. ----------- ----------
  26.           3          4

  27. SYS @ orcl1>select * from tt;

  28. 未选定行

  29. SYS @ orcl1>select parse_calls,executions from v$sql where sql_text='select * from tt';

  30. PARSE_CALLS EXECUTIONS
  31. ----------- ----------
  32.           3          5
复制代码

回复 只看该作者 道具 举报

8#
发表于 2013-8-9 14:38:42
本帖最后由 fiozhang 于 2013-8-9 14:39 编辑

我找到问题了

If SESSION_CACHED_CURSORS is not set, it defaults to 0 and no cursors will be cached for your session. (Your cursors will still be cached in the shared pool, but your session will have to find them there.) If it is set, then when a parse request is issued, Oracle checks the library cache to see whether more than 3 parse requests have been issued for that statement. If so, Oracle moves the session cursor associated with that statement into the session cursor cache. Subsequent parse requests for that statement by the same session are then filled from the session cursor cache, thus avoiding even a soft parse. (Technically, a parse can't be completely avoided; a "softer" soft parse is done that's faster and requires less CPU.)

回复 只看该作者 道具 举报

9#
发表于 2013-8-9 15:23:32

回复 只看该作者 道具 举报

10#
发表于 2013-8-9 15:27:19
谢谢两位老师,我明白了!

回复 只看该作者 道具 举报

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

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

GMT+8, 2025-1-1 11:04 , Processed in 0.047365 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

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