Когда я пишу запрос, как это ...
select *
from table1 t1
join table2 t2
on t1.id = t2.id
Оптимизатор SQL, не уверен, что это правильный термин, переводит это в ...
select *
from table1 t1, table2 t2
where t1.id = t2.id
По сути, является ли оператор Join в SQL Server простым способом написания SQL? Или это на самом деле используется во время выполнения?
Редактировать: я почти всегда и почти всегда буду использовать синтаксис соединения. Мне просто любопытно, что происходит.
sql-server
t-sql
join
optimization
Мистер муравей
источник
источник
GROUP BY ALL
вGROUP BY ALL
нарочно? :-)Ответы:
Те рушатся до одного и того же внутри. Первый - это тот, который вы всегда должны писать . Что более важно, почему это важно? Они идентичны с точки зрения плана выполнения и производительности (при условии, что вы не перепутаете это, что легче сделать с помощью ленивого синтаксиса старого стиля).
Вот доказательство использования AdventureWorks, что нет
CROSS JOIN
иfilter
происходит.Явное соединение:
Неявное соединение:
Смотри, ма! Идентичные планы, идентичные результаты, никаких перекрестных объединений или фильтров не видно нигде.
(Для ясности, предупреждение об
SELECT
операторе в обоих случаях - это неявное преобразование, влияющее на количество элементов, в любом случае это никак не связано с объединением.)источник
Строго говоря, существует разница во входных данных для оптимизатора запросов между двумя формами:
Как вы можете видеть,
ON
предикат предложения тесно связан с объединением с использованием современного синтаксиса. При более старом синтаксисе существует логическое перекрестное соединение, за которым следует реляционный выбор (фильтр строк).Оптимизатор запросов почти всегда объединяет реляционный выбор в объединение во время оптимизации, что означает, что две формы, скорее всего, будут создавать эквивалентные планы запросов, но реальной гарантии нет.
источник
Для внутреннего соединения они взаимозаменяемы, но для внешних соединений они имеют разные значения - ON соответствует, а WHERE - простая фильтрация. Поэтому лучше придерживаться правильного соответствия синтаксиса JOIN при включении.
источник
ОК, мне было любопытно, поэтому я сделал тест. Я получил реальные планы выполнения для следующего.
и
Я сравнил их объект за объектом, и они были идентичны. По крайней мере, для очень простого примера, они пришли к одному и тому же. Я также проверил статистику ввода-вывода и время, и они были достаточно близки, чтобы быть тем же самым.
При этом вам следует использовать
JOIN
синтаксис, потому что его легче читать, и вы с меньшей вероятностью допускаете ошибки, особенно в сложных запросах. И синтаксис*=
/=*
дляOUTER
объединений уже удален с SQL-Server 2005.источник