最近工作中碰到一个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已经相当接近!