powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / JOINS: как лучше написать запрос
8 сообщений из 8, страница 1 из 1
JOINS: как лучше написать запрос
    #32022852
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос, выводящий записи из нескольких таблиц по некому общему полю,
как известно, можно записать по-разному ("ANSI-style" и "MS SQL JOIN-style").
Так вот, могут ли запросы такого вида преобразовываться SQL Server'ом в разные
планы выполнения при каких-либо условиях? Иными словами, нет разницы, как записать
запрос?

select c.ContactName, o.*
from Orders o, Customers c
where o.CustomerID = c.CustomerID


select c.ContactName, o.*
from Orders o
inner join Customers c
on o.CustomerID = c.CustomerID
...
Рейтинг: 0 / 0
JOINS: как лучше написать запрос
    #32022860
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читайте внимательно
BOL - Accessing and Changing Relational Data - Query Fundamentals - Accessing and Changing Relational Data - Specifying Joins in FROM or WHERE Clauses

А вкратце так - для INNER JOIN все равно, для OUTER JOIN не все равно.
...
Рейтинг: 0 / 0
JOINS: как лучше написать запрос
    #32022868
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю,

но я все же спрашивал не про то, приведет ли выполнение запросов,
записанных в двух различных формах, к разным наборам данных (уж это не трудно заметить),
а про то, КАК они будут выполняться сервером (могут ли быть различные планы выполнения)...
...
Рейтинг: 0 / 0
JOINS: как лучше написать запрос
    #32022879
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 jimmers
>(могут ли быть различные планы выполнения)...

Не могут, а будут разными, кстати в статье, на которую ссылается Glory об этом написано, фильтрация записей по условию указанному во from будет проводиться раньше, чем по условию в Where.
...
Рейтинг: 0 / 0
JOINS: как лучше написать запрос
    #32022925
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я просто ставил эксперимент и получил совершенно одинаковые планы выполнения... Вообще-то оптимизатор запросов - это такое жуткое существо с искуственным интелектом и плохо предсказуемым поведением. Когда просишь его построить планы для разных запросов, он строит их одинаковыми. Когда для одного и того же с интервалом в несколько секунд, можешь получить планы выполнения совершенно разные (хотя данные асболютно точно за это время не изменялись).
У меня есть такое предположение, что запрос БЕЗ JOIN преобразуется к запросу с JOIN (где-то там в дебрях этого искуственного интеллекта). А вот ежели указаны одновременно и фраза WHERE, и JOIN, то оптимизатор четко следует последовательности - сначала условие JOIN, потом WHERE.
...
Рейтинг: 0 / 0
JOINS: как лучше написать запрос
    #32022939
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример, где сначала отбираются записи по условию, затем объединяются:

StmtText
----------------------------------------------------------------------------------------------
select M.* from M inner join MT on M.КодМедуслуги = MT.КодМедуслуги
where MT.Стоимость < 5

(1 row(s) affected)

StmtText
--------------------------------------------------------------------------------
|--Hash Match(Inner Join, HASH: ([MT].[КодМедуслуги])=([M].[КодМедуслуги]))
|--Table Scan(OBJECT: ([Test].[dbo].[MT]), WHERE: ([MT].[Стоимость]<5.00))
|--Index Scan(OBJECT: ([Test].[dbo].[M].[IX_M]))

(3 row(s) affected)
[\pre]
...
Рейтинг: 0 / 0
JOINS: как лучше написать запрос
    #32022946
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую,

Для приведенных мной запросов я получил следующее:

|--Hash Match(Inner Join, HASH[c].[CustomerID])=([o].[CustomerID]), RESIDUAL[c].[CustomerID]=[o].[CustomerID]))
|--Clustered Index Scan(OBJECT[Northwind].[dbo].[Customers].[PK_Customers] AS [c]))
|--Clustered Index Scan(OBJECT[Northwind].[dbo].[Orders].[PK_Orders] AS [o]))


То есть, планы одинаковы... Так вот, вопрос так и остался без ответа: может ли статься так, что при некоторых условиях они (планы) станут различными, то бишь один запрос в итоге будет выполняться медленнее другого... Если "Да", то каковы эти самые условия?

Благодарю.
...
Рейтинг: 0 / 0
JOINS: как лучше написать запрос
    #32023015
Ответ уже был дан. При наличии join и where одновременно планы запросов могут быть разными (и одинаковыми).
Рекомендация одна - забыть о старом стиле построения запросов (лечение головной боли отсечением одной из них).
Благо и Microsoft рекомендует также.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / JOINS: как лучше написать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]