• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

对于自适应游标共享的一点补充

mysql 搞代码 4年前 (2022-01-09) 23次浏览 已收录 0个评论

关于自适应游标共享请参加: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具有如下限制(官方文档):


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:对于自适应游标共享的一点补充

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址