天天看点

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

最近工作中碰到一个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实际上不起作用。

其执行计划:

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

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

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

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

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

继续阅读