楼主尝试一下执行的结果就知道了
select name,value from v$sysstat where name like '%parse%';
可以看硬解析的次数,比对以下两种情况下硬解析增加的次数和解析的总次数应该就很清楚了

解决方案 »

  1.   

    把你的程序改成:
    for i to 100
    begin
    sql:= select * from student where name ='Robert' || i ;
    end你就可以看是sql每次执行都要解释sql, 不会用cache中已经编译的sql语句.  
    此时如果把 name = 'Robert' || i 这个值换成绑定变量(bind parameter), 那么该sql执行解释一次, 从而提高效率.(大部分情况下, 应该使用bind parameter. )
      

  2.   

    1.sql:= select * from student where name ='Robert';
      如果你仅执行这样一条语句,不改变上述SQL中任何一个字符的话,效率自然是很高的,每一次都会从sql缓冲池中取得执行,只有第一次需要经过sql语法分析树进行解析,分析执行计划。
    2.sql:= select * from student where name ='Robert' || i ;
      因变量i的改动,每一次执行都为不同的SQL语句,每一次都需要进行解析执行。
    3.sql := Select * from student where name = :Pname;
      变量绑定方式为oracle内部认可的一种方式,而且安全性较高,无论变量:Pname赋为什么值,上述SQL语句仅为一条,仅需一次解析并将分析结果放入Library cache中的shared sql area.下次执行时直接从中获得。
      

  3.   

    感谢天星的回答
    我那个新同事还是写Oracle很久的家伙!看来也不是很专的人
      

  4.   

    所谓邦定变量 只不过是参数化啦! 当在我厂开发的ERP系统中 一个查询界面有多个条件供用户选择 进行组合查询! 
    查询的 Where 条件随着用户给出的查询值而不同!很显然我们的这种写法 Oracle很难SQL计划重用sql := Select * from student where name = :Pname;
    这条语句 如果用户使用多次或者多个用户使用 那么他们将共用一个计划!终于明白了变量班定的道理!!
      

  5.   

    也就是第一次作hard parse
    然后以后都是soft parse不过不好之处也有的.比如.一个表中A记录有一条.B记录有999999999999条.这样的话.如果先计划了=B
    那么.执行A的时候也会选择执行B的执行路径了.