Стратегия выполнения SUB-запросов в Oracle на таблице с огромным количеством кортежей - PullRequest
0 голосов
/ 08 апреля 2019

У нас есть таблица с хорошим количеством строк (150 000+), и каждая строка должна быть выбрана на основе SUB-запроса в другой таблице. Значения, возвращаемые запросом SUB, не зависят от столбца в этой таблице. Итак, будет ли oracle запускать SUB-запрос для каждого кортежа?

Пример

TableZ

id,
location

Таблица A (150K +)

name,
id,
type

TableB

type,
color

Запрос

select * from TableZ 
join
 (select name, id, type from TableA where type is null or type in 
     (select type from TableB where color='red')
 ) tblA_RED on TableZ.id=tblA_RED.id

Мой вопрос: сколько раз SUB-запрос будет выбирать тип из TableB, где color = 'red', будет выполняться?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Обычно механизм БД обрабатывает запрос (выберите тип из таблицы B, где color = 'red') только один раз и используйте результат для создания эквивалента для встроенного представления (выберите имя, id, введите из TableA, где тип равен нулю, или введите (выберите тип из TableB, где color = 'red')) и, наконец, выполните внешний выбор, присоединившись к TableZ.

Вы можете добавить отличительные взапрос, который выбирает тип из TableB, вот так

(select distinct type from TableB where color='red')

Это может дать немного лучшую производительность

0 голосов
/ 08 апреля 2019

Конкретный ответ на ваш вопрос заключается в том, что Oracle должен оценивать подзапрос только один раз.

Однако ваш запрос сформулирован с ненужными подзапросами. Вы можете начать с:

select z.*, a.name, a.id, a.type
from TableZ z join
     TableA a
     on z.id = a.id
where a.type in (select b.type from TableB b where b.color = 'red');

Это вряд ли повлияет на производительность, но упрощает то, что вы делаете. Далее, TableB не имеет дубликатов значений, поэтому я бы предложил:

select z.*, a.name, a.id, a.type
from TableZ z join
     TableA a
     on z.id = a.id left join
     TableB b
     on b.type = a.type
where b.color = 'red' or a.type is null;

Фраза запроса как join часто дает оптимизатору больший выбор - а больший выбор часто означает более быстрые запросы.

...