oracle性能调优之--Oracle硬解析与软解析(三)
www.2cto.com
2.使用绑定变量
绑定变量要求变量名称,数据类型以及长度是一致,否则无法使用软解析
绑定变量(bindvariable)是指在DML语句中使用一个占位符,即使用冒号后面紧跟变量名的形式,如下
select * from emp where empno=7788 --未使用绑定变量
select * from emp where empono=:eno --:eno即为绑定变量
在第二个查询中,变量值在查询执行时被提供。该查询只编译一次,随后会把查询计划存储在一个共享池(库缓存)中,以便以后获取
和重用这个查询计划。
下面使用了绑定变量,但两个变量其实质是不相同的,对这种情形,同样使用硬解析
select * from emp where empno=:eno;
select * from emp where empno=:emp_no
使用绑定变量时要求不同的会话中使用了相同的回话环境,以及优化器的规则等。
使用绑定变量的例子(参照了TOM大师的Oracle 9i&10g
编程艺术)
scott@ASMDB> create table tb_test(col int); --创建表tb_test
scott@ASMDB> create or replace procedure proc1 --创建存储过程proc1使用绑定变量来插入新记录
2 as
3 begin
4 for i in 1..10000
5 loop
6 execute immediate 'insert into tb_test values(:n)' using i;
7 end loop;
8 end;
9 /
Procedure created.
scott@ASMDB> create or replace procedure proc2 --创建存储过程proc2,未使用绑定变量,因此每一个SQL插入语句都会硬解析 www.2cto.com
2 as
3 begin
4 for i in 1..10000
5 loop
6 execute immediate 'insert into tb_test values('||i||')';
7 end loop;
8 end;
9 /
Procedure created.
scott@ASMDB> exec runstats_pkg.rs_start
PL/SQL procedure successfully completed.
scott@ASMDB> exec proc1;
PL/SQL procedure successfully completed.
scott@ASMDB> exec runstats_pkg.rs_middle;
PL/SQL procedure successfully completed.
scott@ASMDB> exec proc2;
PL/SQL procedure successfully completed.
scott@ASMDB> exec runstats_pkg.rs_stop(1000);
Run1ran in 1769 hsecs www.2cto.com
Run2ran in 12243hsecs --run2运行的时间是run1的/1769≈倍
run1 ran in 14.45% of the time
Name Run1 Run2 Diff
LATCH.SQL memory managerworka 410 2,694 2,284
LATCH.sessionallocation 532 8,912 8,380
LATCH.simulator lrulatch 33 9,371 9,338
LATCH.simulator hashlatch 51 9,398 9,347
STAT...enqueuerequests 31 10,030 9,999
STAT...enqueuereleases 29 10,030 10,001
STAT...parse count (hard) 4 10,011 10,007 --硬解析的次数,前者只有四次
STAT...calls to get snapshots 55 10,087 10,032
STAT...parse count (total) 33 10,067 10,034
STAT...consistentgets 247 10,353 10,106
STAT...consistent gets from ca 247 10,353 10,106
STAT...recursivecalls 10,474 20,885 10,411
STAT...db block gets from cach 10,408 30,371 19,963
STAT...db blockgets 10,408 30,371 19,963
LATCH.enqueues 322 21,820 21,498 --闩的队列数比较
LATCH.enqueue hashchains 351 21,904 21,553
STAT...session logical reads 10,655 40,724 30,069
LATCH.library cachepin 40,348 72,410 32,062 --库缓存pin
LATCH.kksstats 8 40,061 40,053
LATCH.library cachelock 318 6