Oracle SQL In Subquery отнимает слишком много времени по сравнению с жестко закодированными значениями - PullRequest
0 голосов
/ 21 июня 2019

У меня есть простой запрос, выполнение которого занимает около 2 минут по сравнению с 8 секундами при выполнении с жестко закодированным значением.

SELECT * 
FROM TABLE_A
WHERE TRANSACTION_DATE = (SELECT PREV_WORKING_DAY 
                          FROM TABLE_B )

SELECT PREV_WORKING_DAY FROM TABLE_B возвращает '20 -JUN-2019 '.

И TRANSACTION_DATE, и PREV_WORKING_DAY имеют формат даты.

Когда мы жестко кодируем дату в выводе запроса, это 100 миллисекунд

SELECT * 
FROM TABLE_A
WHERE TRANSACTION_DATE = '20-JUN-2019'

Всего записей = 82 000

Любая идея, что вызывает задержку при использовании подзапроса и как мы можем оптимизировать то же самое.

Я знаю, что могу конвертировать то же самое в PL / SQL и присвоить значение переменной, но все же я хочу понять, что вызывает задержку.спасибо

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Я полагаю, что у вас нет или очень устаревшая статистика для TABLE_B, поэтому Oracle не знает, что у нее есть только одна строка. Следовательно, он выбирает неэффективный план. План объяснения расскажет вам о мощности подзапроса.

Если это так, то решение:

dbms_stats.gather_table_stats(user, 'TABLE_B');

Вам следует прочитать документацию по сбору статистики .

0 голосов
/ 21 июня 2019

Что произойдет, если вы переключитесь на JOIN?

SELECT A.*
FROM TABLE_A A JOIN
     TABLE_B B
     ON A.TRANSACTION_DATE B.PREV_WORKING_DAY;
...