Как указал Мартин, проблема в дорогой функции regexp_count.Таким образом, вопрос сводится к следующему:
Почему:
select * from (
with dat as (select level lv, rpad('X',500,'X') txt from dual connect by level <= 20000)
select lv,
REGEXP_COUNT(txt, '(ABC|DEF)([[:digit:]]){5}') as occurrences
from dat
--where REGEXP_COUNT(txt, '(ABC|DEF)([[:digit:]]){5}') > 1
) where rownum > 1
0,019 секунд и
select * from (
with dat as (select level lv, rpad('X',500,'X') txt from dual connect by level <= 20000)
select lv,
REGEXP_COUNT(txt, '(ABC|DEF)([[:digit:]]){5}') as occurrences
from dat
where REGEXP_COUNT(txt, '(ABC|DEF)([[:digit:]]){5}') > 1
) where rownum > 1
6,7 секунд.Oracle оценивает regexp_count в обоих исполнениях.Таким образом, должна быть разница в оценке в части where и в части select.