什么是绑定变量?
查询通常只是因为改变where子句中的内容而产生不同的结果。为了在这种情况下避免硬解析,我们需要使用绑定变量(bind variable)。它是用户放入查询中的占位符,它会告诉Oracle"我会随后为这个变量提供一个值,现在需要生成一个方案,但我实际执行语句的时候,我会为您提供应该使用的实际值"。
select * from emp where ename='KING'; //不使用绑定变量
select * from emp where ename=:bv //使用绑定变量
使用绑定变量对性能的影响
使用绑定变量的好处:
1. 如果Oracle能在共享池中找到用户要执行的sql语句,那么会省略解析、确定优化方案等过程;
2. 用户在使用共享池的时候,会锁定它,如果使用绑定变量,那么会大大减少锁定的时间;
执行下面这个例子,可以看到使用和不使用绑定变量的区别:
SQL> alter system flush shared_pool;
SQL> set serveroutput ondeclare
l_start number;
l_cnt number;
begin
l_start := dbms_utility.get_time;
for i in 1..100
loop
execute immediate
'select count(*) from dual
where dummy='''||to_char(i)||''''
into l_cnt;
end loop;
dbms_output.put_line('No binds'||(dbms_utility.get_time - l_start)||'hsecs');
l_start := dbms_utility.get_time;
for i in 1..100
loop
execute immediate
'select count(*) from dual
where dummy=:x'
into l_cnt
USING to_char(i);
end loop;
dbms_output.put_line('binding'||(dbms_utility.get_time - l_start)||'hsecs');
end;
为了使性能更好,以下方面需要注意:
1. 在所有可能的地方使用完全相同的查询文本;
2. 尽量将sql语句隐藏在存储过程或者函数中;
3. 在应用程序的编程中,也要尽量使用函数、过程等可以调用的结构中去;
来自:《Oracle 编程入门经典》( Beginning Oracle Programming )
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84224/,如需转载,请注明出处,否则将追究法律责任。