硬解析:是指Oracle在执行目标SQL时,在库缓存中找不到可以重用的解析树和执行计划,而不得不从头开始解析目标SQL并生成相应的Parent Cursor和Child Cursor的过程。
软解析:是指Oracle在执行目标SQL时,在Library Cache中找到了匹配的Parent Cursor和Child Cursor,并将存储在Child Cursor中的解析树和执行计划直接拿过来重用,无须从头开始解析的过程。
ok,上面是SQL执行过程的简单介绍,由此可知,假如sql执行过程,在共享池里找不到执行计划、解析树等就会重现解析sql,生成执行计划和解析树等,这个过程是比较耗时间的,所以要想办法尽量不要重现解析sql,需要执行计划直接去共享池拿已经生成的
举个例子,select * from sys_user where userid='u10001';
和select * from sys_user where userid='u10002';
,这两个很类似的sql在执行过程,生成的执行计划很有可能是不一样的,也就是说第一条sql执行后,第二条sql继续执行,假如发现找不到对应执行计划,就会再解析sql,重现生成session cursor和一对shared cursor(parent cursor和child cursor)
然后,我们不想重新解析sql,有什么方法?方法就是用绑定变量的方法
二、绑定变量典型用法
2.1、在SQL中绑定变量
绑定变量的典型用法就是用 :variable_name的形式,variable_name是自定义的变量名称,variabl_name可以是字母、数字或者字母和数字的组合
ok,上面的那种类型的sql,就可以用一条带绑定变量的sql来表示:
select * from sys_user where userid = :u;
这样这种类型的一堆sql都只会解析一次,不用每条sql都解析一遍,可以很好的提高系统处理能力
ok,举个例子说明
环境准备:
create table t as select * from dba_objects;
注意,这些脚本只能在sqlplus或者PLSQL客户端的命令窗口执行
/* 定义绑定变量vid */ SQL> variable vid number; /* 给绑定变量赋值为2 */ SQL> exec :vid := 2;
在sqlplus或者PLSQL客户端的命令窗口执行
SQL> select * from t where object_id = :vid;
select a.*, b.name from v$sesstat a, v$statname b where a.statistic# = b.statistic# and a.sid = (select distinct sid from v$mystat) and b.name like '%parse%';
select sql_text, parse_calls, executions from v$sql where sql_text like 'select * from t where object_id=%';
SELECT * FROM (select PARSING_US