今天在看一本oracle的书,说到软解析会比硬解析效率更高,并且差别比较大,但是我分别用两段sql测试了下,并没有什么区别,反而结果显示硬解析的效率稍微高一点点,下面是我用的例子;
--硬解析
declare 
begin
for kk in 1 .. 10000 loop
insert into zhb_test_1 (str1) values (kk);
end  loop;
end;--软解析
declare 
v_str  varchar2(10);
begin
for kk in 1 .. 10000 loop
execute immediate 'insert into zhb_test_1 (str1) values (:v_str)'using kk;/*execute immediate 'insert into zhb_test_1 (str1) values ('|| kk||')';
*/end  loop;
end;我试着把10000这个数字改成50000和100000,但是结果并不是我想像的那样随着数量的增多而体现软解析的优势,那么到底是什么原因呢 ?

解决方案 »

  1.   


    看下他们的Hash值 是否相同.Oracle SQL的硬解析和软解析
    http://blog.csdn.net/tianlesoftware/archive/2010/04/07/5458896.aspx------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    DBA1 群:62697716(满); DBA2 群:62697977
      

  2.   

    楼主的比较方式有误,动态SQL的效率无法同直接SQL相比,
    应该写成这样,比较试试看
    --硬解析
    DECLARE
    BEGIN
      FOR kk IN 1 .. 10000 LOOP
        EXECUTE IMMEDIATE 'INSERT INTO zhb_test_1 (str1) VALUES (''' || kk || ''')';
      END LOOP;
    END;--软解析
    DECLARE
      v_str VARCHAR2(10);
    BEGIN
      FOR kk IN 1 .. 10000 LOOP
        EXECUTE IMMEDIATE 'insert into zhb_test_1 (str1) values (:v_str)'
          USING kk;
      END LOOP;
    END;
      

  3.   

    declare  
    begin
    for kk in 1 .. 10000 loop
    insert into zhb_test_1 (str1) values (kk);
    end loop;
    end;
    好像oracle会自动解析为 insert into zhb_test_1 (str1) values (:kk);
      

  4.   

    谢谢2楼3楼,明白了些动态SQL的效率无法同直接SQL相比
      

  5.   

    Oracle 8.1.6 增加了新的参数CURSOR_SHARING=FORCE 。如果你愿意,这个特性会实现一个自动绑定器(auto-binder)。如果有一个查询编写为 SELECT COUNT(*) FROM EMP WHERE EMPNO =1234,自动绑定器会把它改写成 SELECT COUNT(*) FROM EMP WHERE EMPNO =:X 。这能大大减少硬解析数。