Regexp_like导致Oracle优化器判断失误例子

来源:互联网 发布:wei护肤品怎么样知乎 编辑:程序博客网 时间:2024/05/16 07:06

最近工作中碰到一个SQL,大致如下:

select <select-list>

from tab1, tab2

where tab1.col1=tab2.col2

and tab1.col4='0005'

and  regexp_like(decode(:bindvar1,'All','All', tab1.col3),('^(' || regexp_replace(:bindvar1,'[,,]', '|' ) || ')$'));

tab1.col4='0005'是个选择性很弱的谓词。而bindvar1='All',所以这个regexp_like实际上不起作用。

其执行计划:

可以看到E-Rows和A-Rows有巨大偏差。在Tab1表已经收集了统计信息,包括col4,col3上的直方图。

将regexp_like去掉后,可以看到执行计划有了变化:


E-Rows和A-Rows已经相当接近!



0 0
原创粉丝点击