Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
СУБД: Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


Собственно начал разбирать ниже приведенный запрос с целью поиска возможности уменьшить время выполнения и столкнулся с тем что подзапрос выполняется около часа, а целиком запрос выолняется за 7 - 10 сек. Из за чего такое может быть?

Я думаю возможная причина в "WITH (nolock)" хотя не уверен.

Кто знает почему так?


SELECT
[AdtServer_dvAll5].[CreationTime] [DateTime],
[AdtServer_dvAll5].[Id] [AuditData],
((COALESCE([AdtServer_dvAll5].[TargetDomain], '') + '\') + COALESCE([AdtServer_dvAll5].[TargetUser], '')) [AccountCreated],
((COALESCE(CASE WHEN [AdtServer_dvAll5].[ClientLogonId] = 0 THEN [AdtServer_dvAll5].[PrimaryDomain] ELSE [AdtServer_dvAll5].[ClientDomain] END, '') + '\') + COALESCE(CASE WHEN [AdtServer_dvAll5].[ClientLogonId] = 0 THEN [AdtServer_dvAll5].[PrimaryUser] ELSE [AdtServer_dvAll5].[ClientUser] END, '')) [CreatedBy],
[AdtServer_dvAll5].[EventMachine] [Computer],
[AdtServer_dvAll5].[SequenceNo] [expr1],
[AdtServer_dvAll5].[CreationTime] [expr2],
[AdtServer_dvAll5].[CollectionTime] [expr7]
FROM
(
SELECT Id, EventId, SequenceNo, [S/F], Category, CreationTime, CollectionTime, AgentMachine, EventMachine, Source, HeaderSid, HeaderUser,
HeaderDomain, PrimarySid, PrimaryUser, PrimaryDomain, PrimaryLogonId, ClientSid, ClientUser, ClientDomain, ClientLogonId, TargetSid, TargetUser,
TargetDomain, String01, String02, String03, String04, String05
FROM AdtServer.dvAll5 WITH (nolock)
) [AdtServer_dvAll5]
WHERE
CONVERT(DATETIME, CONVERT(CHAR(10), [AdtServer_dvAll5].[CreationTime], 102), 102) >= CONVERT(DATETIME,'2012-01-01 00:00:00', 121) AND CONVERT(DATETIME, CONVERT(CHAR(10), [AdtServer_dvAll5].[CreationTime], 102), 102) <= CONVERT(DATETIME,'2012-03-01 00:00:00', 121) AND ([AdtServer_dvAll5].[EventId] = 624 OR [AdtServer_dvAll5].[EventId] = 4720)
ORDER BY
[DateTime]
2 мар 12, 13:03    [12182732]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
andrew shalaev
и столкнулся с тем что подзапрос выполняется около часа, а целиком запрос выолняется за 7 - 10 сек. Из за чего такое может быть?

Потому что разные запросы НЕ должны выполняться за одинаковое время
Почему вы считаете, что сервер сначала должен выполнять подзапрос, а потом только внешний запрос ?
2 мар 12, 13:05    [12182759]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
И никогда не пишите такое в WHERE...
2 мар 12, 13:08    [12182780]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Glory,

Т.к. в запросе конструкция From выполняется первой, следовательно подзапрос должен выполнится первым и уже с его множеством будет работать внешний запрос
2 мар 12, 13:11    [12182812]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Geep,

Это не я написал, это приложение отсылает такой запрос на сервер
2 мар 12, 13:13    [12182825]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
andrew shalaev
Т.к. в запросе конструкция From выполняется первой, следовательно подзапрос должен выполнится первым и уже с его множеством будет работать внешний запрос

Да что вы говорите !
А почему сервер не может убрать скобки и применить условие WHERE сразу ? Скобки - это святое ?
2 мар 12, 13:14    [12182839]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
andrew shalaev
Это не я написал, это приложение отсылает такой запрос на сервер

Не совсем понял тогда, как хотите исправлять... К разработчику.
2 мар 12, 13:16    [12182858]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Т.к. в запросе конструкция From выполняется первой, следовательно подзапрос должен выполнится первым и уже с его
> множеством будет работать внешний запрос

это только логически так. то есть, возвращаемый результат должен быть
таким, как будто все так и есть.
а как реально выполняется запрос - это в плане выполнения смотреть надо.

Posted via ActualForum NNTP Server 1.5

2 мар 12, 13:17    [12182870]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
andrew shalaev
Glory,

Т.к. в запросе конструкция From выполняется первой, следовательно подзапрос должен выполнится первым и уже с его множеством будет работать внешний запрос
http://msdn.microsoft.com/ru-ru/library/ms189499(v=sql.105).aspx
Логический порядок обработки инструкции SELECT
Следующие действия демонстрируют логический порядок обработки, или порядок привязки, инструкции SELECT. Согласно этому порядку предложения последующих стадий получают доступ к объектам, определенным на предыдущей стадии. Например, если обработчик запросов может привязываться (обращаться) к таблицам или представлениям, определенным в предложении FROM, то эти объекты и их столбцы становятся доступны для всех последующих стадий. С другой стороны, поскольку стадия предложения SELECT — 8, то любые псевдонимы столбцов или производные столбцы, определенные в этом предложении, не могут упоминаться в предыдущих предложениях. Однако они могут упоминаться в последующих предложениях, например в предложении ORDER BY. Обратите внимание, что фактическое физическое выполнение предложения определяется обработчиком запросов и фактический порядок выполнения может отличаться от порядка в данном списке.
FROM

ON

JOIN

WHERE

GROUP BY

WITH CUBE или WITH ROLLUP

HAVING

SELECT

DISTINCT

ORDER BY

TOP
Обратите особое внимание на замечание про Ваше безобразие в WHERE
2 мар 12, 13:18    [12182875]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Geep,

Собственно я собираюсь проанализировать план выполнения запроса, узнать по каким индексам он работает, какой момент выполнения запроса самый дорогостоящий. Может еще подсунуть трассу с этим запросом тюннинг адвистеру и посмотреть его предложения по улучшению производительности...

Сам код запроса я менять не намерен. Меня удивило как может часть запроса работать медленнее чем весь запрос целиком, не понятен этот момент
2 мар 12, 13:22    [12182909]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
andrew shalaev
подзапрос выполняется около часа, а целиком запрос выолняется за 7 - 10 сек
andrew shalaev
Geep,

Собственно я собираюсь проанализировать план выполнения запроса, узнать по каким индексам он работает, какой момент выполнения запроса самый дорогостоящий. Может еще подсунуть трассу с этим запросом тюннинг адвистеру и посмотреть его предложения по улучшению производительности...

Сам код запроса я менять не намерен. Меня удивило как может часть запроса работать медленнее чем весь запрос целиком, не понятен этот момент
Отдельно выполняемый подзапрос пересылает все-все данные из таблицы на клиента.
А весь запрос уже на сервере отбирает из них только данные, удовлетворяющие предикату, и возвращает только их.
Что тут непонятного?
Работать должен ещё быстрее, если сделать правильные индексы и написать по-человечески WHERE
2 мар 12, 13:29    [12182991]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
iap,

спасибо, Ваш ответ осмыслил всех быстрее :)
2 мар 12, 13:31    [12183016]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения подзапроса на порядок больше чем время выполнения запроса  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
Индексы Вам не помогут с такими условиями в WHERE.
2 мар 12, 15:36    [12184189]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить