Это будет зависеть от платформы.
SQL Server анализирует логические последствия ограничений (внешние ключи, первичные ключи и т. Д.) И расширяет встроенные функции VIEW. Это означает, что «нерелевантная» часть кода VIEW устарела оптимизатором. SQL Server даст одинаковый план выполнения для всех трех случаев. (Обратите внимание: есть предел сложности, с которым может справиться оптимизатор, но он, безусловно, может справиться с этим.)
Однако не все платформы созданы равными.
- Некоторые могут не анализировать ограничения одним и тем же способом, предполагая, что вы закодировали соединение по причине
- Некоторые могут предварительно скомпилировать план исполнения / объяснения VIEW
Таким образом, чтобы определить поведение, вы должны знать о возможностях конкретной платформы. В подавляющем большинстве ситуаций оптимизатор - сложный зверь, поэтому лучший тест - просто попробовать и посмотреть.
EDIT
В ответ на ваш дополнительный вопрос, являются ли предпочтительными коррелированные подзапросы? Простого ответа не существует, поскольку он зависит от данных и логики, которую вы пытаетесь реализовать.
В прошлом, безусловно, были случаи, когда я их использовал, как для упрощения структуры запроса (для удобства сопровождения), так и для включения определенной логики.
Если поле table_b.id_a
ссылается на множество записей в таблице_а, вам может потребоваться имя только из самой последней. И вы могли бы реализовать это, используя (SELECT TOP 1 name_a FROM table_a WHERE id_a = table_b.id_a ORDER BY id_a DESC)
.
Короче, это зависит.
- по логике запроса
- о структуре данных
- На окончательном макете кода
Чаще всего я нахожу, что это не нужно, но довольно часто я нахожу, что это положительный выбор.
Примечание:
В зависимости от коррелированного подзапроса, он не всегда выполняется «один раз для каждой записи». Например, SQL Server расширяет требуемую логику, которая должна выполняться в соответствии с остальной частью запроса. Важно отметить, что код SQL обрабатывается / компилируется / что угодно перед выполнением. SQL - это просто метод формулирования логики на основе множеств, который затем преобразуется в традиционные циклы и т. Д. С использованием наиболее оптимальных алгоритмов, доступных оптимизатору.
Другие СУБД могут работать по-другому из-за возможностей или ограничений оптимизатора. Некоторые СУБД работают хорошо при использовании IN (SELECT blah FROM blah)
или при использовании EXISTS (SELECT * FROM blah)
, но довольно ужасно. То же самое относится и к коррелированным подзапросам. Sub работают с ними исключительно хорошо, некоторые не так хорошо работают, но большинство справляются очень хорошо по моему опыту.