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

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

6

积分

0

好友

0

主题
1#
发表于 2012-4-22 12:13:11 | 查看: 3947| 回复: 1
Misses in library cache during parse和Misses in library cache during execute,trace文件中的,怎么在执行阶段oracle也要解析呢?没有查到详细介绍的,有没有人知道的?



The compilation of a SQL statement consists of two phases: the parse phase and the execute phase. When the time comes to parse a SQL statement, Oracle first checks to see if the parsed representation of the statement already exists in the library cache. If not, Oracle will allocate a shared SQL area within the library cache and then parse the SQL statement.
At execution time, Oracle checks to see if a parsed representation of the SQL statement already exists in the library cache. If not, Oracle will reparse and execute the statement. -- the error will come out from this step. could be various reaconsequentlyns why it was flushed out of lc.


看到这段解释,有两点不明白
第1,已经解析完的sql为什么要在执行阶段进行解析。
第2,Oracle没有理由将已经解析没多久的sql,从缓冲区移除啊
2#
发表于 2012-4-22 13:13:33
1. parse 和 execution 是不同的2个阶段;
    如果你使用 隐式游标 那么 parse 结束后会立即 execute 执行,例如我在sqlplus中运行一条SQL:

select         *  from maclean

    如果我们使用显示 游标 或者 动态SQL ,那么解析完成后 会按照代码的设计 去execute 例如 下例中 我们 open cursor时 该sql就会被parse , 但是 实际execute 是60s之后

SQL> declare
  2  cursor vCUR is select 121 from dual;
  3  v_cur  number;
  4  begin
  5  open vCUR;
  6  dbms_lock.sleep(60);
  7  fetch vCUR into  v_cur;
  8  end ;
  9  /

又如:

SQL>      declare
        l_cursor  number;
        begin
                l_cursor:=dbms_sql.open_cursor;
                dbms_sql.parse(l_cursor,'SELECT /* LLLLL */ * FROM dual',dbms_sql.native);
                dbms_sql.close_cursor(l_cursor);
          END LOOP;
         end;
       /

我们甚至可以只解析 sql 而不执行它


如果sql 在执行阶段发现 已解析过的 SQL 的sql plan 在shared pool中的 sql area中已失效 ,就需要再次parse这个SQL 并生成 child cursor


SQL> select * from v$sgastat where name like '%sql%';

POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  sql area                      6926952

造成sql plan 失效的原因可能有:
1. alter system flush shared pool  被冲刷
2.  shared pool free memory 不足造成 child cursor 被 LRU掉
3.  child cursor 失效 invalidation

第2,Oracle没有理由将已经解析没多久的sql,从缓冲区移除啊

如上所述

回复 只看该作者 道具 举报

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

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

GMT+8, 2024-12-25 00:33 , Processed in 0.046975 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

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