Oracle 绑定变量 示例

    技术2022-05-20  53

     

     

    绑定变量对Oracle 的性能来说是非常重要的,之前有整理一些理论知识:

           Oracle 绑定变量 详解

    http://www.cndba.cn/Dave/article/1572

     

           Event 10053 执行计划 绑定变量 Bind peeking

           http://blog.csdn.net/tianlesoftware/archive/2010/04/29/5544307.aspx

     

           在这里演示一下绑定变量的例子, 注意,绑定变量对索引选择性不好的列不适用,可能会导致错误的执行计划,从而影响SQL 效率。

     

    有关索引的选择性,参考:

           Oracle 索引的维护

    http://www.cndba.cn/Dave/article/1157

         

     

     

    示例

     

    SQL> create table t1(c1 number,c2 number,c3 number,c4 number);

    Table created.

     

    SQL> declare

      2  i number;

      3  j number;

      4  str varchar2(200);

      5  begin

      6  i :=1;

      7  j :=2;

      8  str :='insert into t1 values(:x,:y,:x,:y)';

      9  execute immediate str using i,j,i,j;

     10  end;

     11  /

     

    PL/SQL procedure successfully completed.

     

    SQL> select * from t1;

     

    C1         C2         C3         C4

    ---------- ---------- ---------- ----------

    1          2          1          2

     

    这里是绑定变量的一个简单应用, 绑定变量起到占位的作用.

     

    进一步的测试:ORACLE系统本身是能够对变量做绑定的。

     

    SQL> set timing on

    SQL> declare       

      2  i number;

      3  begin

      4  for i in 1..1000 loop

      5     insert into t1 values(i,i+1,i+2,i+3);

      6  end loop;

      7  end;

      8  /

     

    PL/SQL procedure successfully completed.

    Elapsed: 00:00:00.28

     

    SQL> select count(*) from t1;

      COUNT(*)

    ----------

          1001

     

    Elapsed: 00:00:00.01

     

           在这段代码块的执行过程中,ORACLE会自动将其中的变量进行绑定。 也就是说:这段代码执行了1000 insert 语句,但是每次发出去的语句都是一样的,1000SQLhash 值是一样的,他们的执行计划也是一样的。

     

     

    对上述代码进行修改:

     

    SQL> declare

      2     i number;

      3     str varchar2(200);

      4  begin

      5     for i in 1..1000 loop

      6     str:='insert into t1 values ('||to_char(i)||','||to_char(i)||'+1,'||to_char(i)||'+2,'||to_char(i)||'+3)';

      7     execute immediate str;

      8  end loop;

      9  end;

     10  /

     

    PL/SQL procedure successfully completed.

     

    Elapsed: 00:00:02.88

     

    这段代码没有自动使用绑定变量,所以时间上明显长。 我们使用绑定变量看看。

     

    SQL> declare

      2     i number;

      3     str varchar2(200);

      4  begin

      5     for i in 1..1000 loop

      6     str:='insert into t1 values (:i,:i+1,:i+2,:i+3)';

      7     execute immediate str using i,i,i,i;

      8  end loop;

      9  end;

     10  /

     

    PL/SQL procedure successfully completed.

     

    Elapsed: 00:00:00.19

     

    使用绑定变量后,时间明显要少很多。

     

     

     

     

     

     

     

    -------------------------------------------------------------------------------------------------------

    QQ: 492913789 Email: ahdba@qq.com Blog: http://www.cndba.cn/dave

    DBA1 群:62697716();   DBA2 群:62697977()   DBA3 群:62697850()  

    DBA 超级群:63306533();  DBA4 群: 83829929  DBA5群: 142216823   

    聊天 群:40132017   聊天2群:69087192

    --加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请


    最新回复(0)