РЕДАКТИРОВАТЬ: Исходя из ваших комментариев (и комментария Кирка Волля), вы должны понимать, что порядок ваших объединений эстетичен и не оказывает прямого влияния на итоговый план выполнения .Оптимизатор запросов выполнит объединения в наиболее эффективном порядке и большую часть времени будет использовать соответствующую операцию соединения без каких-либо подсказок.
Когда дело касается эстетики вашего порядка соединения, это немногосубъективно, но я бы сказал, что объединение ваших таблиц в любом порядке имеет логический смысл при чтении запроса ... если вы начинаете с @HeaderId, начинайте с этой таблицы, а затем JOIN
с дочерних таблиц:
FROM
Header h
JOIN Items i ON h.HeaderId = i.HeaderId
JOIN Details d ON i.ItemId = d.ItemId
WHERE
h.HeaderId = @HeaderId
Но, если бы вы начали свой запрос с @DetailId, я бы присоединился в обратном порядке.
FROM
Details d
JOIN Items i ON d.ItemId = i.ItemId
JOIN Header h ON i.HeaderId = h.HeaderId
WHERE
d.DetailId = @DetailId
Однако это субъективно и только мое личное предпочтение.
Это становится менее субъективным, когда вы начинаете включать OUTER JOIN
s ... попробуйте структурировать свой запрос, чтобы избежать любых RIGHT OUTER JOIN
s, и вместо этого используйте LEFT OUTER JOIN
.
Не используйте joinподсказки по умолчанию ... фактически вы почти никогда не будете их использовать.Оптимизатор запросов отлично справляется с выбором оптимального плана выполнения.Я встречал только один случай, когда мне нужно было предоставить подсказку о присоединении для улучшения плана ... он сильно помог на сервере, на котором выполнялся запрос, но когда база данных была перенесена на другой сервер,Моя подсказка о присоединении уничтожила производительность запроса.Итак, повторюсь, обычно плохая идея предоставлять подсказки о присоединении.