前言: Oracle在执行SQL语句时,普遍存在以下几个步骤:当SQL语句首次执行,Oracle将确认该句语句的语法是否正确(语法解析Syntax parse)并进一步确认语句相关表和列的存在性等因素(语义解析semantic parse)以及优化器决定执行计划等步骤。整个过程称之为硬解析,硬解析消耗大量的CPU时间和系统资源。硬解析过多会有效降低系统性能。 若之前已进行过硬解析,且解析后的分析树和执行计划仍存在于共享池中,则同样的SQL仅需要软解析。软解析将输入的SQL语句转换为哈希代码,同共享池内哈希链表上的已有记录进行对比,找出对应的游标信息,使用已有的执行计划执行。绑定变量,将实际的变量值代入SQL语句中。 执行SQL语句,查询语句将返回结果集。 不使用绑定变量的SQL语句,Oracle无法将它们视为相同的,如以下两句语句: select * from emp where empno=1234 select * from emp where empno=5678 因为自由变量的不同,Oracle认为以上是2句不同的语句,则当第一条被硬解析后,第二条SQL执行时仍无法避免硬解析。实际在以上不使用绑定变 量的情况中,只要自由变量有所改变则需要一次硬解析。这是强烈建议使用绑定变量的主要原因,使用绑定变量的语句变量的实际值仅在SQL执行的最后阶段被代 入。如以下语句: select * from emp where empno=:x 该语句使用绑定值:x替代自由变量,在应用中语句可能以预编译或普通编译的方式存在,仅在执行阶段代入变量值,多次执行仅需要一次硬解析,较不使用绑定变量情况性能大大提升。
测试步骤:
测试方法:分别使用绑定变量和不使用绑定变量分别向表中插入10000条数据,测量所使用的时间:
测试前请先运行以下脚本:
步骤1:set echo on;(把执行结果显示出来)
步骤2:alter system flush shared_pool;这条语句是清空共项池,每次都必须使用,确保共享池是空的,以提高执行效率;
步骤3:set timing on(打开记时器.)
一、绑定变量的测试
1、创建表A1,脚本:create table A1(x int);
2、带参数的存储过程
create or replace procedure pro1
as
begin
for i in 1 .. 100000
loop
execute immediate
'insert into A1 values(:x)' using i;
end loop;
end;
/
运行结果:
SYS@orcl> exec pro2;
PL/SQL procedure successfully completed.
Elapsed: 00:00:57.42
二、不带绑定变量的测试
create table A2(x int);
create or replace procedure pro2
as
begin
for i in 1 .. 100000
loopexecute immediate'insert into A2 values('||i||')';end loop;end;运行看看结果:
SYS@orcl>exec pro1
PL/SQL procedure successfully completed.
Elapsed: 00:00:07.60
总结:使用绑定变量的速度和不使用绑定变量相差的数量级不是同一个等级的;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12679300/viewspace-1138107/ ,如需转载,请注明出处,否则将追究法律责任。