Я работаю над переписыванием некоторых плохо написанных SQL-запросов, и они чрезмерно используют подзапросы. Я ищу лучшие практики использования подзапросов.
Любая помощь будет оценена по достоинству.
Я работаю над переписыванием некоторых плохо написанных SQL-запросов, и они чрезмерно используют подзапросы. Я ищу лучшие практики использования подзапросов.
Любая помощь будет оценена по достоинству.
Подзапросы обычно подходят, если они не являются зависимыми подзапросами (также известными как коррелированные подзапросы). Если вы используете только независимые подзапросы и они используют соответствующие индексы, они должны выполняться быстро. Если у вас есть зависимый подзапрос, вы можете столкнуться с проблемами производительности, поскольку зависимый подзапрос обычно необходимо запускать один раз для каждой строки внешнего запроса. Таким образом, если ваш внешний запрос содержит 1000 строк, подзапрос будет выполнен 1000 раз. С другой стороны, независимый подзапрос обычно нужно оценивать только один раз.
Если вы не уверены, что подразумевается под зависимым или независимым подзапросом, вот практическое правило: если вы можете взять подзапрос, удалить его из контекста, запустить его и получить набор результатов, то это independent subquery
.
Если вы получаете синтаксическую ошибку, потому что она ссылается на некоторые таблицы вне подзапроса, тогда это dependent subquery
.
Общее правило, конечно, имеет несколько исключений. Например:
Если производительность является проблемой, измерьте свои конкретные запросы и посмотрите, что лучше всего подходит для вас.
Здесь нет серебряной пули. Каждое использование должно оцениваться независимо. В некоторых случаях коррелированные подзапросы просто неэффективны, этот ниже лучше написать как JOIN
select nickname, (select top 1 votedate from votes where user_id=u.id order by 1 desc)
from users u
С другой стороны, запросы EXISTS и NOT EXISTS преобладают над JOIN.
select ...
where NOT EXISTS (.....)
Обычно быстрее, чем
select ...
FROM A LEFT JOIN B
where B.ID is null
Однако даже эти обобщения могут быть неверны для любой конкретной схемы и распределения данных.
К сожалению, ответ во многом зависит от используемого вами SQL-сервера. Теоретически соединения лучше с чисто реляционной точки зрения. Они позволяют серверу делать правильные вещи под капотом и дают им больше контроля и, таким образом, могут работать быстрее. Если сервер реализован хорошо. На практике некоторые SQL-серверы работают лучше, если вы обманываете их, оптимизируя запросы с помощью подзапросов и тому подобного.