最近工作中碰到一个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已经相当接近!
本文探讨了一个SQL查询中的正则表达式使用不当导致执行效率低下的问题,并通过实例展示了如何优化SQL查询以提高执行效率。通过移除不必要的正则表达式,执行计划中的估算行数与实际行数差异显著减小。
3万+

被折叠的 条评论
为什么被折叠?



