使用绑定变量减少硬解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用绑定变量减少硬解析
1、引言
ORACLE数据库在执行SQL语句时,如果在共享池中找不到一样的SQL语句则会进行硬解析,硬解析会花费CPU和内存资源。
在做硬解析时,共享池中的类库缓存只能被不同的进程串行访问,ORACLE为了保证SGA数据结构不被破坏而增加的控制;进程在使用SGA 前必需先获取相应的栓,只有拿到栓的进程才能访问相应的内存区。
使用绑定变量可以减少硬解析、提高SQL共享,减少硬解析,同时也可以减少共享池的争用。
2、现象描述
数据库运行过程中,相同的SQL语句经常要反复执行。
如果不使用绑定变量,每次执行时都需要进行硬解析(硬解析会占用CPU的时间片)。
当数据库在高峰期时,花在重复解析相同的语句时间就会变长同时共享池争用也很严重;
3、处理过程
(1)把需要进行绑定变量的SQL脚本写成字符串;
(2)字符串中有条件的地方换成:<variable>的形式;
(3)通过动态游标(OPEN FOR)来打开字符串所对应的SQL语句,同时传入相应的参数;
(4)通过动态SQL(EXECUTE IMMEDIATE)来执行相应的字符串并串入相应的参数;
(5)执行脚本并返回结果;
(6)通过(3)执行的需要关闭游标;(4)会自动关闭游标;
4、举例说明
在PL/SQL中,可以通过EXECUTE IMMEDIATE 语句、OPEN ..FOR ..语句来实现SQL语句的绑定变量,下面举两个简单例子分别进行说明。
通过OPEN..FOR语句实现
DECLARE
c sys_refcursor;
v varchar2(100):='select to_char(sysdate,''yyyy-mm-dd'')
from dual
where dummy=:1';
r varchar2(10);
BEGIN
open c for v using'X';
loop
fetch c into r;
exit when c%notfound;
dbms_output.put_line(r);
end loop;
close c;
END;
通过EXECUTE IMMEDIATE语句实现
DECLARE
c sys_refcursor;
v varchar2(100):='select to_char(sysdate,''yyyy-mm-dd'')
from dual
where dummy=:1';
r varchar2(10);
BEGIN
execute immediate v into r using'X' ;
dbms_output.put_line(r);
END;
5、经验总结
(1)绑定变量可以减少SQL语句执行时间,降低共享池争用;
(2)使用绑定变量优化器得到的执行计划可能不是最优的;
(3)使用绑定变量可以使程序书写更加灵活,更易维护;。