先看过程
create or replace procedure test(sdep in varchar2,icount1 out integer,icount2 out integer) is
ssql  varchar2(1024):='';begin
  --第一条SQL
  select count(*)  into icount1 from  person t where t.dep = sdep and sex='2';
  
  --第二条SQL
  ssql := 'select count(*) from person where t.dep = '|| sdep ;
  execute immediate ssql into icount2 ;
  
  return;
end test;其中有两条SQL语句
,姑且把第一条SQL称为静态SQL,第二条称为动态SQL小菜有疑问,该过程在进行测试后,查询视图:select * from v$sqlarea a where SQL_TEXT like '%person%';
只能查到第二条SQL被记录下来问题1:
第一条SQL存下来没有呢?存哪里了?问题2:
person.dep字段未设索引,为何在参数改变的时候其查询速度不受影响?问题3:
能否详细说明此类静态SQL在存储过程中的执行原理?万分感谢啊!!

解决方案 »

  1.   


    oracle内部经过检测发现,你的第1条sql不需要走索引,所以v$sqlarea 里面不会有信息的。
      

  2.   


    问题2: 
    person.dep字段未设索引,为何在参数改变的时候其查询速度不受影响? 
    如果没有索引,全表扫描,第一次会读取所有数据块,第二次执行时,如果数据块
    未淘汰出buffer cache,则应该第二次稍为快一些。少些物理读问题3: 
    能否详细说明此类静态SQL在存储过程中的执行原理? 
    orcle执行存储过程发现静态SQL后,会用普通SQL执行引擎去处理
    SQL执行主要分为分析、执行、取数三个阶段
      

  3.   

    问题2:
    为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行计划存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果该语句和之前的执行过的某一语句完全相同,并且之前执行的该语句与其执行计划仍然在内存中存在,则ORACLE就不需要再进行分析,直接得到该语句的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并大大节省了内存的使用。使用这个功能的关键是将执行过的语句尽可能放到内存中,所以这要求有大的共享池(通过设置shared buffer pool参数值)和尽可能的使用绑定变量的方法执行SQL语句。 
    当你向ORACLE 提交一个SQL语句,ORACLE会首先在共享内存中查找是否有相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。
      

  4.   

    是不是可以这样解释:
    1、 无论如何,动态SQL语句在存储过程中执行时都会被暂时储存在v$sqlarea中?2、 静态SQL在存储过程中执行时都会存放在内存中?对这种方面的理解还是不够啊查了些相关绑定变量的文档,也没有说清静态SQL在存储过程中的执行原理,郁闷中!!
      

  5.   

    哪位大侠能否介绍下关于视图以及介绍类似于v$sqlarea这些奇怪的表的资料。很多书在讲oracle讲得不够细和深入。Q:304467593
      

  6.   

    哪位大侠能否介绍下关于视图以及介绍类似于v$sqlarea这些奇怪的表的资料。很多书在讲oracle讲得不够细和深入。Q:304467593