绑定变量对Oracle 的性能来说是非常重要的,之前有整理一些理论知识: Oracle 绑定变量详解 http://www.linuxidc.com/Linux/2011-04/34781.htm 在这里演示一下绑定变量的例子, 注意,绑定变量对索引选择性不好的列不适用,可能会导致错误的执行计划,从而影响SQL 效率。 有关索引的选择性,参考: Oracle 索引的维护 http://www.linuxidc.com/Linux/2011-04/34782.htm 示例
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 onSQL> 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 语句,但是每次发出去的语句都是一样的,这1000次SQL的hash 值是一样的,他们的执行计划也是一样的。 对上述代码进行修改: 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 使用绑定变量后,时间明显要少很多。 Oracle AWR 介绍Oracle 绑定变量详解相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)