【问题】
通常我们在执行数据库查询时候或编写存储过程时使用直接将变量编写在脚本中,这样会影响oracle的查询效率,如:
为了查询一个员工代号是123,通常是这样查询:
select * from emp where empno='123';
【分析】
查询员工'123'一次以后,有可能再也不用;接着你有可能查询员工'456',然后查询'789'等等;如果查询使用象第一个查询语句,每次查询都是一个新的查询(硬编码的查询方法);因此,Oracle每次必须分析,解析,安全检查, 优化等等;
当我们把一个sql语句提交完后,Oracle绑定变量会检查一下在共享缓冲池(shared pool)中有无与之完全相同的相关语句,如果有的话只须执行软分析即可,否则就得进行硬分析,而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。
【处理】
使用绑定变量的方式
例如:
declare
v_sql varchar2(1000);
v_empno varchar2(100);
v_cur Sys_Refcursor;
v_name varchar2(100);
begin
v_empno:='123';
v_sql := 'select * from emp where empno=:empno';
execute immediate v_sql using v_empno;
end;
如果使用多个参数,则直接在using后使用","号间隔
使用游标查询返回的结果集:
open Sys_Refcursor for v_sql using v_empno;
将执行的结果返回变量中:
v_sql:='select name from emp where empno:=empno';
execute immediate v_sql into v_name using empno;
【注意】
在字段(包括字段集)建有索引,且字段(集)的集的势非常大(也就是有个值在字段中出现的比例特别的大)的情况下,使用绑定变量可能会导致查询计划错误,因而会使查询效率非常低。这种情况最好不要使用绑定变量。
通常我们在执行数据库查询时候或编写存储过程时使用直接将变量编写在脚本中,这样会影响oracle的查询效率,如:
为了查询一个员工代号是123,通常是这样查询:
select * from emp where empno='123';
【分析】
查询员工'123'一次以后,有可能再也不用;接着你有可能查询员工'456',然后查询'789'等等;如果查询使用象第一个查询语句,每次查询都是一个新的查询(硬编码的查询方法);因此,Oracle每次必须分析,解析,安全检查, 优化等等;
当我们把一个sql语句提交完后,Oracle绑定变量会检查一下在共享缓冲池(shared pool)中有无与之完全相同的相关语句,如果有的话只须执行软分析即可,否则就得进行硬分析,而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。
【处理】
使用绑定变量的方式
例如:
declare
v_sql varchar2(1000);
v_empno varchar2(100);
v_cur Sys_Refcursor;
v_name varchar2(100);
begin
v_empno:='123';
v_sql := 'select * from emp where empno=:empno';
execute immediate v_sql using v_empno;
end;
如果使用多个参数,则直接在using后使用","号间隔
使用游标查询返回的结果集:
open Sys_Refcursor for v_sql using v_empno;
将执行的结果返回变量中:
v_sql:='select name from emp where empno:=empno';
execute immediate v_sql into v_name using empno;
【注意】
在字段(包括字段集)建有索引,且字段(集)的集的势非常大(也就是有个值在字段中出现的比例特别的大)的情况下,使用绑定变量可能会导致查询计划错误,因而会使查询效率非常低。这种情况最好不要使用绑定变量。