Насколько хорошо писать такой запрос?

4

sql,database,oracle,query-performance,

SQL, базы данных, Oracle, запрос производительность,

Ответов: -1


1 принят

Если вы хотите использовать коррелированный подзапрос (это нормально), вы должны сделать следующее:

d

Важные изменения:

  • Квалифицируйтесь все имена столбцов (я не знаю , где a, bи dприходят из).
  • Используйте явно join.

Вы также можете написать этот запрос как:

select a, b, t3.x, d
from table1 z join
     table2 zz
     on z.id = zz.id left join
     table3 t3
     on t3.id = z.id;

Этот запрос существенно отличается от предыдущего. Предыдущий возвращает ошибку, если подзапрос возвращает более одной строки. Каждый из этих значений будет помещен в другой столбец.

Тем не менее, оптимизатор Oracle неплох. Я был бы удивлен, если бы была заметная разница в производительности.


1

Использование соединения запроса было более читаемым

Но производительность - это то же самое

select a,
b,
c.x,
d
from table1 z
join table2 zz on z.id = zz.id
join table3 c on z.id = c.id;

1

Если ваш подзапрос возвращает одно значение на основе одного входа, это скалярный подзапрос. Скалярный подзапрос МОЖЕТ повысить производительность вашего запроса. Это будет сделано в соответствии с несколькими основными условиями. Во-первых, если z.id имеет относительно малое количество возможных значений. Если я вспомню, обработка вложенных подкадров будет кэшировать до 254 значений. Во-вторых, если остальная часть запроса возвращает относительно большое количество строк. В этом случае, если вы вернете только несколько строк, тогда кэширование не будет иметь возможности помочь. Но если вы возвращаете много строк, преимущества кэширования будут нарастать.

Другие уже подчеркнули, что ваши исходные запросы не совсем эквивалентны.

Подробнее о скалярных подзапросах можно узнать здесь -> Скалярные подзапросы


0

Первый запрос с коррелированным подзапросом всегда возвращает данные, даже если таблица 3 пуста. Чтобы получить тот же результат, вам нужно внешнее соединение:

select a,
       b,
       c.x,
       d
from table1 z
join table2 zz on z.id = zz.id
left join table3 c on z.id = c.id
SQL, базы данных, Oracle, запрос производительность,
Похожие вопросы