Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
JOINS: как лучше написать запрос
|
|||
|---|---|---|---|
|
#18+
Запрос, выводящий записи из нескольких таблиц по некому общему полю, как известно, можно записать по-разному ("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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 09:36 |
|
||
|
JOINS: как лучше написать запрос
|
|||
|---|---|---|---|
|
#18+
Читайте внимательно BOL - Accessing and Changing Relational Data - Query Fundamentals - Accessing and Changing Relational Data - Specifying Joins in FROM or WHERE Clauses А вкратце так - для INNER JOIN все равно, для OUTER JOIN не все равно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 10:00 |
|
||
|
JOINS: как лучше написать запрос
|
|||
|---|---|---|---|
|
#18+
Благодарю, но я все же спрашивал не про то, приведет ли выполнение запросов, записанных в двух различных формах, к разным наборам данных (уж это не трудно заметить), а про то, КАК они будут выполняться сервером (могут ли быть различные планы выполнения)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 11:14 |
|
||
|
JOINS: как лучше написать запрос
|
|||
|---|---|---|---|
|
#18+
2 jimmers >(могут ли быть различные планы выполнения)... Не могут, а будут разными, кстати в статье, на которую ссылается Glory об этом написано, фильтрация записей по условию указанному во from будет проводиться раньше, чем по условию в Where. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 12:49 |
|
||
|
JOINS: как лучше написать запрос
|
|||
|---|---|---|---|
|
#18+
А я просто ставил эксперимент и получил совершенно одинаковые планы выполнения... Вообще-то оптимизатор запросов - это такое жуткое существо с искуственным интелектом и плохо предсказуемым поведением. Когда просишь его построить планы для разных запросов, он строит их одинаковыми. Когда для одного и того же с интервалом в несколько секунд, можешь получить планы выполнения совершенно разные (хотя данные асболютно точно за это время не изменялись). У меня есть такое предположение, что запрос БЕЗ JOIN преобразуется к запросу с JOIN (где-то там в дебрях этого искуственного интеллекта). А вот ежели указаны одновременно и фраза WHERE, и JOIN, то оптимизатор четко следует последовательности - сначала условие JOIN, потом WHERE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2002, 17:23 |
|
||
|
JOINS: как лучше написать запрос
|
|||
|---|---|---|---|
|
#18+
Вот пример, где сначала отбираются записи по условию, затем объединяются: 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] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2002, 05:36 |
|
||
|
JOINS: как лучше написать запрос
|
|||
|---|---|---|---|
|
#18+
Приветствую, Для приведенных мной запросов я получил следующее: |--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])) То есть, планы одинаковы... Так вот, вопрос так и остался без ответа: может ли статься так, что при некоторых условиях они (планы) станут различными, то бишь один запрос в итоге будет выполняться медленнее другого... Если "Да", то каковы эти самые условия? Благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2002, 07:29 |
|
||
|
JOINS: как лучше написать запрос
|
|||
|---|---|---|---|
|
#18+
Ответ уже был дан. При наличии join и where одновременно планы запросов могут быть разными (и одинаковыми). Рекомендация одна - забыть о старом стиле построения запросов (лечение головной боли отсечением одной из них). Благо и Microsoft рекомендует также. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2002, 15:44 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32022860&tid=1823903]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
143ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 420ms |

| 0 / 0 |
