外部验证账号 oracleoracle绑定变量与非绑定变量比较

案例演示前准备工作:

–alter system flush shared_pool; 
–set timing on;
–从一个“空”的共享池开始,如果多次运oracle账号营这些测试语句,就需要每次清空共享池,
否则,非绑定变量sql将被缓存,这样看起来运行非常快   www.2cto.com  

—-案例–使用非绑定变量
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1..1000
loop open l_rc for
'select object_name from all_objects where object_id='||i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)||'seconds…');
end;
/

 

—-案例–使用绑定变量
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1..1000
loop open l_rc for
'select object_name from all_objects where object_id=:x' using i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)||'seconds…');
end;
/

 

  www.2cto.com  
使用非绑定变量的明显比使用绑定变量的耗时长,原因在于:非绑定变量每次查询都是一个新的查询,即在数据库中以前没有过的查询。每次查询必须经过分析、限定(名称解析)、安全检查、优化等等;而使用绑定变量的查询,绑定变量的值在查询执行时提供。查询经过一次编译后,查询方案存储在共享池(库高速缓存)中,可以用来检索和重用,故二者的差异是巨大的。因此我们在实际工作中,应根据实际情况进行选择。
 

此条目发表在oracle metalink账号分类目录,贴了标签。将固定链接加入收藏夹。