У нас есть таблица с большим количеством строк (150 000+), и каждая строка должна быть выбрана на основе SUB-запроса к другой таблице. Значения, возвращаемые запросом SUB, не зависят от столбца в этой таблице. Итак, будет ли оракул запускать запрос SUB для каждого кортежа?
Пример
ТаблицаZ
id,
location
ТаблицаA (150 тыс.+)
name,
id,
type
Таблица Б
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 будет выбирать тип из таблицы B, где выполняется color='red'?
Без Дополнительная информация сказать особо нечего. Oracle может даже выполнить запрос нулевое время так как в 12.1 его можно переписать в Null принимает полусоединение
Обычно механизм БД обрабатывает запрос (выберите тип из таблицы B, где цвет = «красный») только один раз и использует результат для создания эквивалента встроенного представления для (выберите имя, идентификатор, тип из таблицы A, где тип равен нулю, или введите (выберите тип из таблицы B, где цвет = «красный»)) и, наконец, выполнить внешний выбор, присоединившись к TableZ.
Возможно, вы захотите добавить отдельный запрос, который выбирает тип из TableB, например:
(select distinct type from TableB where color='red')
Это может дать немного лучшую производительность
Конкретный ответ на ваш вопрос заключается в том, что 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
часто дает оптимизатору больше выбора, а больший выбор часто означает более быстрые запросы.
OP включает условие «где тип имеет значение null или тип или тип (...», поэтому я думаю, вам может потребоваться внешнее соединение с таблицей B и добавление «и a.type имеет значение null в предложение WHERE». В противном случае найдите
Для вопросов по коду SQL дайте DDL для важной информации об индексации. Также дайте вывод EXPLAIN, когда выполнение/реализация/оптимизация запроса имеет значение.