关于自适应游标共享请参加:http://blog.gaodaima.com/yidian815/article/details/17959907 对自适应游标共享的理解,本人认为难点在于对BIND_SENSITIVE 和BIND_AWARE的认识。再来复习一下: bind_sensitive:oracle认为该语句可能会因为绑定变量的不同而需要采取
关于自适应游标共享请参加:http://blog.gaodaima.com/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 NUMBERSQL> select column_name,histogram from dba_tab_cols where table_name='T2' AND OWNER='EASY1';COLUMN_NAME HISTOGRAM---------------------<span>本文来源gaodai#ma#com搞*代#码9网#</span>--------- ---------------ID NONERTYPE FREQUENCYSEL NONESQL> 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-062 2 .000015259 .0000152593 4 .000030518 .0000305184 8 .000061036 .0000610365 16 .000122072 .0001220726 32 .000244144 .0002441447 64 .000488289 .0004882898 128 .000976577 .0009765779 256 .001953155 .00195315510 512 .00390631 .0039063111 1024 .007812619 .007812619RTYPE COUNT(1) MIN(SEL) MAX(SEL)-------------------- ---------- ---------- ----------12 2048 .015625238 .01562523813 4096 .031250477 .03125047714 8192 .062500954 .06250095415 16384 .125001907 .12500190716 32768 .250003815 .25000381517 65536 .50000763 .50000763
sel代表rype在整张表中的选择性。
首先我们猜测第一个问题的答案。
因为bind_sensitive是针对绑定变量的不同取值而论的,因此我们认为只有具有绑定变量的语句才可能是bind_sensitive的。
SQL> select sum(id) from t2 where rtype=16; SUM(ID)----------1610596352SQL> 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 Nselect 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 Nselect sum(id) from t2 where id=:v N Nselect sum(id) from t2 where rtype=:v Y Nselect sum(id) from t2 where rtype=16 N N
看来不光需要具有绑定变量,还需要在绑定变量所在列上具有直方图统计信息才可以。当然这是在等值操作的情况下,在其他情况下那?在这里我们不做分析,至少在目前的情况下,oracle对bind_sensitive具有如下限制(官方文档):