绑定变量
1.绑定变量通过两种方式影响应用程序。第一,从开发的角度看,他可以让开发变简单,也可以让开发变得复杂,具体的效果取觉于用来
执行SQL语句的API。
第二,从性能的角度看,绑定变量既有优势也有劣
优点:
绑定变量的优点是可以在库缓存中共享游标,这样就可以避免硬解析以及与之相关的额外开销。
SQL> create table t_bind(id int,v_name varchar2(40));
表已创建。
SQL> variable n number;
SQL> variable v varchar2(32);
SQL> insert into t_bind(id,v_name) values(:n,:v);
SQL> execute :n:=1;:v:='A';
SQL> insert into t_bind(id,v_name) values(:n,:v);
SQL> execute :n:=2;:v:='B';
SQL> insert into t_bind(id,v_name) values(:n,:v);
SQL> variable v varchar2(33);
SQL> execute :n:=3;:v:='cccccccccccccccccccccccccccccccc';
SQL> insert into t_bind(id,v_name) values(:n,:v);
----------------------------------------------------------
select sql_id,child_number, executions
from v$sql
where sql_text = 'insert into t_bind(id,v_name) values(:n,:v)'
ID SQL_ID ChirldID Executions
1 bfy1zu9vsrurp 0 1
2 bfy1zu9vsrurp 1 2
-----------------------------------------------------------
select child_number,bind_mismatch
from v$sql_shared_cursor
where sql_id='bfy1zu9vsrurp'
ID child_number bind_mismatch
1 0 N
2 1 Y
-----------------------------------------------------------
造成上述原因是由于数据库引擎应用了绑定变量分级(graduation),这个功能的目的是为了最小化游标的
数量,它是根据绑定变量的长短将绑定变量(各个大小不同)分为4个级别。在32个字节以内被分在第一个
级别,33到128个字节的被分分配在第二级别,129到2000个字节的被分配在第三个级别,其余的大于2000个
字节的被分配在第四个级别。NUMBER类型的绑定变量被分在它的最大长度22个字节的级别上。
查看分级:
select s.child_number,
m.position,
m.max_length,
decode(m.datatype, 1, 'varchar2', 2, 'Number', m.datatype) as datatype
from v$sql s, v$sql_bind_metadata m
where s.SQL_ID = 'bfy1zu9vsrurp'
and s.CHILD_ADDRESS = m.ADDRESS
order by 1, 2;
CHILD_NUMBER POSITION MAX_LENGTH DATATYPE
1 0 1 22 Number
2 0 2 32 varchar2
3 1 1 22 Number
4 1 2 128 varchar2
以上可以看出,新创建的子游标,都会生成一个新的执行计划。新的执行计划是否与另一个子游标使用的执行一致,
也依赖于绑定变量的值。
2.缺点
在WHERE子句中使用绑定变量的缺点是会有一些过至关重要的信息对查询优化器不可见。事实上对查询优化器来讲
使用字面量要比使用绑定变量要来得更好一些。使用字面量可以提高开销估算的准确性。
注:只要使用到绑定变量,查询优化器都会忽略它们的具体个值。在Oracle 9i 中引入了一个被称为绑定变量窥测
(bind variable peeking)的功能。但在绑定变量窥测不支持随Oracle 9i 发布的瘦驱动。
绑定变量窥测的原理比较简单。在物理优化阶段,查询优化器会窥测绑定变量的值,将它做为字面变量来使用。
有必要强调,只要游标还保存在库缓存中并且可以被共享,就可以被重用。为了解决这个问题,Oracle 11g中引入
了一个称为扩展性游标共享(extended Cursor sharing,也称适应性游标共享,adaptive cursor sharing)的新功
能。它的目的是在重用一个已经存在的但是会导致执行效率低下的游标能够自动进行识别。
在11G中通过以下字段:
is_bind_sensitive(绑定是否敏感)- 不仅指出是否使用变量窥测来生成执行计划,而且指出这个执行计划是否依赖于窥测到的值,如果是,这个字段的值被设置为Y,否则会设置为N.
is_bind_aware(是否绑定可知) - 表明游标是使用了扩展共享。如果设置为N,这个游标将被废弃,不再可用。
is_shareable(是否可共享) - 表明游标能否被共享。如果设置为N,这个游标将被废弃,不再可用。
新增的动态性能视图:
1.v$sql_cs_statistics 是否使用窥测
2.v$sql_cs_selectivity 显示与每个了游标的每个选择性条件相关的选择范围。
3.v$sql_cs_histogram
通过上述视图可以分析生成两个了游标的原因。
最佳的实践:
使用任何特性都需要权衡利弊得失。例如在进行普通插入语时,没有理由不使 用绑定变量。
sql语句处理少量数据-每逢被处理的数据量很少的时候,解析时间有可能会接 近甚至高于执行时间。这种情况,使用绑定变量是一种较优的选择。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13571112/viewspace-670063/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13571112/viewspace-670063/