Oracle 绑定变量 示例
2011-10-31 18:10
309 查看
绑定变量对Oracle 的性能来说是非常重要的,之前有整理一些理论知识:
Oracle 绑定变量 详解
/article/1672905.html
Event 10053 执行计划 绑定变量 Bind peeking
/article/1672717.html
在这里演示一下绑定变量的例子, 注意,绑定变量对索引选择性不好的列不适用,可能会导致错误的执行计划,从而影响SQL 效率。
有关索引的选择性,参考:
Oracle 索引的维护
/article/1673095.html
示例
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 语句,但是每次发出去的语句都是一样的,这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 绑定变量 详解
/article/1672905.html
Event 10053 执行计划 绑定变量 Bind peeking
/article/1672717.html
在这里演示一下绑定变量的例子, 注意,绑定变量对索引选择性不好的列不适用,可能会导致错误的执行计划,从而影响SQL 效率。
有关索引的选择性,参考:
Oracle 索引的维护
/article/1673095.html
示例
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 语句,但是每次发出去的语句都是一样的,这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 绑定变量 示例
- ORACLE绑定变量初解
- 绑定变量学习示例-未完待续
- 在JAVA 源程序中编写SQL语句时使用ORACLE 绑定变量
- java中使用oracle的绑定变量
- Oracle绑定变量窥探
- oracle 11.2.0.1告警日志报错ORA-03137与绑定变量窥探BUG9703463
- oracle PL/SQL 中变量绑定用法
- Oracle 数据库的绑定变量特性及应用
- Oracle 绑定变量窥探
- ORACLE绑定变量初解
- ORACLE绑定变量的使用
- oracle PL/SQL 中变量绑定用法
- Oracle 绑定变量窥探
- Oracle 10g 与 11g 绑定变量(Bind Variable) 区别 说明
- Oracle绑定变量
- ORA-01745: 无效的主机/绑定变量名 ORA-00917: 缺失的逗号 oracle日期格式错误
- Oracle 数据库的绑定变量特性及应用
- ORACLE 绑定变量用法总结(转)
- oracle 如何获取绑定变量的值