Факторинг подзапроса Oracle не работает для вызова функций - PullRequest
0 голосов
/ 06 декабря 2018

Я использую 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. как оптимизировать этот запрос?

...