Я использую Oracle 11g.У меня есть запрос, который занимает 6 секунд, чтобы выполнить
select *
from tab1
where exists (select 1
from tab2
where tab2.col1 = tab1.col1
and tab2.col2 = pkg1.fn1('STRING'));
Подсвеченная функция возвращает постоянное значение = 1. (Функция имеет 1 запрос, который при автономном выполнении возвращает результат в течение <1 секунды. </p>
Если я жестко кодирую 1 вместо вызова функции, запрос возвращает те же результаты через <1 секунду. </p>
Я не хочу использовать RESULT_CACHE в функции и т. Д. Я хочу переписать запрос так, чтобы он былбыстрее.
Подход 1: Нет разницы во времени Запрос в функции выводится и используется как подзапрос
and tab2.col2 = pkg1.fn1('STRING')
изменен на
and tab2.col2 = (query within the function is written here)
Подход 2: время увеличено Запрос в функции выводится и используется как внутреннее соединение с общим запросом в предложении Существовать.
Подход 3: Нетизменить
with factoring as (select pkg1.fn1('STRING') as return_val from dual)
select *
from tab1
where exists (select 1
from tab2, factoring
where tab2.col1 = tab1.col1
and tab2.col2 = factoring.return_val);
Подход 4: Без изменений
with factoring as (select pkg1.fn1('STRING') as return_val from dual)
select *
from tab1, factoring
where exists (select 1
from tab2
where tab2.col1 = tab1.col1
and tab2.col2 = factoring.return_val);
Я хочу понять ниже 1. почему подход 3 и 4 не сработал2. как оптимизировать этот запрос?