parse count (failures) 0
Step5:在139人再次发出相似的查询语句:
SQL> select * from tab1 where id=3;
ID NAME
---------- ----------
3 CON$
3 I_IND1
Step6:再次查询139会话中的解析情况:
SQL> select name,value from v$sesstat a ,v$statname b where a.statistic#=b.statistic# and a.sid=139 and b.name like '%parse%';
NAME VALUE
---------------------------------------------------------------- ----------
parse count (total) 388
parse count (hard) 62
parse count (failures) 0
这个实验的结果我们已经看到了,这两条语句不同共享执行计划。试想如果每天有大量的用户登录,每个用户在登录时,都无法共享相似语句的执行计划,这将白白耗费多少CPU时间啊。这个时间就是绑定变量派上用场的时候了。下面我们先来看个使用绑定变量的例子:
Step1:在139会话中定义绑定变量User_id,并将它的值赋为4。
SQL> var user_id number;
SQL> exec :user_id:=4;
PL/SQL 过程已成功完成。
Step2:在139会话中使用绑定变量进行查询:
SQL> select * from tab1 where id=:user_id;
ID NAME
---------- ----------
4 UNDO$
4 I_CDEF2
Step3:观察139会话的解析次数:
SQL> select name,value from v$sesstat a ,v$statname b where a.statistic#=b.statistic# and a.sid=139 and b.name like '%parse%';
NAME VALUE
---------------------------------------------------------------- ----------
parse count (total) 395
parse count (hard) 69
parse count (failures) 0
Step4:将绑定变量User_id的值变为5,再次执行查询:
SQL> exec :user_id:=5;
PL/SQL 过程已成功完成。
注意,此语句也要解析,因此,我们在这里还要查看一下解析次数:
Step5:查看139会话的解析次数:
SQL> select name,value from v$sesstat a ,v$statname b where a.statistic#=b.statistic# and a.sid=139 and b.name like '%parse%';
NAME VALUE
---------------------------------------------------------------- ----------
parse count (total) 396
parse count (hard) 70
parse count (failures) 0
Step6:在139会话中,用绑定变量再次做一次查询:
SQL> select * from tab1 where id=:user_id;
ID NAME
---------- ----------
5 C_COBJ#
5 I_PROXY_RO
查询的结果,是ID为5的行。这里,我们使用了同样的语句分别查询出了ID为4的行和ID为5的行。
Step7:查看139会话的解析次数:
SQL> select name,value from v$sesstat a ,v$statname b where a.statistic#=b.statistic# and a.sid=139 and b.name like '%parse%';
NAME VALUE
---------------------------------------------------------------- ----------
parse count (total) 397
parse count (hard) 70
parse count (failures)