关于自适应游标共享请参加:http://blog.csdn.net/yidian815/article/details/17959907
对自适应游标共享的理解,本人认为难点在于对BIND_SENSITIVE 和BIND_AWARE的认识。再来复习一下:
bind_sensitive:oracle认为该语句可能会因为绑定变量的不同而需要采取不同的执行计划,因此需要监控该语句的执行并依据执行结果做出判断。
bind_aware:oracle通过监视已经认定该语句需要针对不同的绑定变量取值采取不同的执行计划。
现在就好出现如下的问题:
oracle认定什么样式的sql语句是bind_sensitve
对于bind_aware的语句,oracle是如何根据不同的变量取值来选择执行计划的?
在回答这些问题之前,先来看一下测试环境
SQL> desc t2;
名称 是否为空 类型
----------------------------------------------------- -------- ------------------------------------
ID NUMBER
RTYPE VARCHAR2(20)
SEL NUMBER
SQL> select column_name,histogram from dba_tab_cols where table_name='T2' AND OWNER='EASY1';
COLUMN_NAME HISTOGRAM
------------------------------ ---------------
ID NONE
RTYPE FREQUENCY
SEL NONE
SQL> select rtype,count(1),min(sel),max(sel) from t2 group by rtype order by 3;
RTYPE COUNT(1) MIN(SEL) MAX(SEL)
-------------------- ---------- ---------- ----------
1 1 7.6295E-06 7.6295E-06
2 2 .000015259 .000015259
3 4 .000030518 .000030518
4 8 .000061036 .000061036
5 16 .000122072 .000122072
6 32 .000244144 .000244144
7 64 .000488289 .000488289
8 128 .000976577 .000976577
9 256 .001953155 .001953155
10 512 .00390631 .00390631
11 1024 .007812619 .007812619
RTYPE COUNT(1) MIN(SEL) MAX(SEL)
-------------------- ---------- ---------- ----------
12 2048 .015625238 .015625238
13 4096 .031250477 .031250477
14 8192 .062500954 .062500954
15 16384 .125001907 .125001907
16 32768 .250003815 .250003815
17 65536 .50000763 .50000763
sel代表rype在整张表中的选择性。
首先我们猜测第一个问题的答案。
因为bind_sensitive是针对绑定变量的不同取值而论的,因此我们认为只有具有绑定变量的语句才可能是bind_sensitive的。
SQL> select sum(id) from t2 where rtype=16;
SUM(ID)
----------
1610596352
SQL> select sum(id) from t2 where rtype=1;
SUM(ID)
----------
1
SQL> l
1* select sql_text,is_bind_sensitive,is_bind_aware from v$sql where sql_text like 'select sum(id) from t2%'
SQL> /
SQL_TEXT I I
------------------------------------------------------------ - -
select sum(id) from t2 where rtype=1 N N
select sum(id) from t2 where rtype=16 N N
是不是具有绑定变量就一定会是bind_sensitive
SQL> var v varchar2(100)
SQL> select sum(id) from t2 where rtype=:v;
SUM(ID)
----------
SQL> select sum(id) from t2 where id=:v;
SUM(ID)
----------
SQL> l
1* select sql_text,is_bind_sensitive,is_bind_aware from v$sql where sql_text like 'select sum(id) from t2%'
SQL> /
SQL_TEXT I I
------------------------------------------------------------ - -
select sum(id) from t2 where rtype=1 N N
select sum(id) from t2 where id=:v N N
select sum(id) from t2 where rtype=:v Y N
select sum(id) from t2 where rtype=16 N N
看来不光需要具有绑定变量,还需要在绑定变量所在列上具有直方图统计信息才可以。当然这是在等值操作的情况下,在其他情况下那?在这里我们不做分析,至少在目前的情况下,oracle对bind_sensitive具有如下限制(官方文档):
The optimizer has peeked at the bind values to generate selectivity estimates.
A histogram exists on the column containing the bind value.
- 下面一段文字来自网络,尽快参考
Q: What triggers a cursor to be marked "bind sensitive"
A: Our goal is to consider many types of predicates where the selectivity can change when the bind value changes. In this first version of the feature, we only handle equality p