最近工作中碰到一個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已經相當接近!