Стратегия выполнения запроса SUB в Oracle для таблицы с огромным количеством кортежей

У нас есть таблица с большим количеством строк (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'?

Для вопросов по коду SQL дайте DDL для важной информации об индексации. Также дайте вывод EXPLAIN, когда выполнение/реализация/оптимизация запроса имеет значение.

philipxy 08.04.2019 08:27

Без Дополнительная информация сказать особо нечего. Oracle может даже выполнить запрос нулевое время так как в 12.1 его можно переписать в Null принимает полусоединение

Marmite Bomber 08.04.2019 09:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обычно механизм БД обрабатывает запрос (выберите тип из таблицы 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». В противном случае найдите

Jim Castro 08.04.2019 01:38

Другие вопросы по теме