天天看點

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已經相當接近!

繼續閱讀