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

Откуда: г. Калуга
Сообщений: 1198
Подскажите, стоит ли городить такой запрос

select RID, ...,
       WSS.Cost
from  dbo.WareSupply WS inner join
      (select SupplyID, SUM(SelfPrice * Qty) as Cost, SUM(Qty) as Qty
       from  WareSupplyItems I inner join WareSupply W on W.OpID = I.SupplyID -- <<<=============
       where JournalDocKind = 5      -- <<<===============
       group by SupplyID) as WSS on WS.OpID = WSS.SupplyID
where JournalDocKind = 5


вместо такого

select RID, ...,
       WSS.Cost
from  dbo.WareSupply WS inner join
      (select SupplyID, SUM(SelfPrice * Qty) as Cost, SUM(Qty) as Qty
       from  WareSupplyItems I 
       group by SupplyID) as WSS on WS.OpID = WSS.SupplyID
where JournalDocKind = 5


Я прогнал оба на большой базе - время выполнения почти не отличается. Запрос запихивается во вьюху и условие JournalDocKind = 5 не будет менятся
2 фев 15, 16:52    [17207723]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
Я прогнал оба на большой базе - время выполнения почти не отличается.

Тогда о чем ваш вопрос, если вы уже замеряли время выполнения ?
2 фев 15, 16:55    [17207739]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory, вопрос больше в теории. Насколько я понимаю второй запрос сначала "отработает" ВСЮ таблицу WareSupplyItems а потом join случится? Допустим я не мерял время, как в теории это отрабатывает? JournalDocKind не индекс
2 фев 15, 16:59    [17207769]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
Насколько я понимаю второй запрос сначала "отработает" ВСЮ таблицу WareSupplyItems а потом join случится?

Вы пересказывает план выполнения вашего сервера ?
Или рассказываете о том, чтобы вы делали, если бы родилсь SQL Server-ом ?
2 фев 15, 17:01    [17207781]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory,Вы пересказывает план выполнения вашего сервера насколько я его умею читать
2 фев 15, 17:03    [17207794]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
пересказывает план выполнения вашего сервера насколько я его умею читать

Т.е. начинается игра - угадай, в какой руке какой план, и какой из них лучше.
2 фев 15, 17:05    [17207809]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory, планы во вложении
Не нашел в фаге как их на форум правильно выкладывать

К сообщению приложен файл (plan.zip - 5Kb) cкачать
2 фев 15, 17:16    [17207902]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
хмхмхм
Guest
minva,

Немного непонятен ход вашей мысли.
Зачем вы в подзапросе хотите сделать второй джойн на таблицу WareSupply? Вы думаете, что лишний джойн ускорит запрос?
2 фев 15, 18:11    [17208271]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
хмхмхм
Guest
minva,

Если я правильно понял, то обычно то, что вы хотите сделать делается следующим образом:

Создается временная таблица с нужными индексами, куда выгружаются RID, ...,
WSS.Cost

по условию where JournalDocKind = 5 из вашей таблицы WareSupply.

Затем подзапрос
select SupplyID, SUM(SelfPrice * Qty) as Cost, SUM(Qty) as Qty
from WareSupplyItems I

соединяется с этой временной таблицей с выводом всех столбцов.
2 фев 15, 18:15    [17208291]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
minva
Насколько я понимаю второй запрос сначала "отработает" ВСЮ таблицу WareSupplyItems а потом join случится? Допустим я не мерял время, как в теории это отрабатывает? JournalDocKind не индекс


Вопрос как отработает - сильно зависит. Один и тот же текст запроса может "отработать" в физическом смысле в зависимости от разных условий, начиная от количества памяти на конкретном сервере, заканчивая доступными индексами, актуальностью статистики и т.д. За то, как отработает запрос в физическом смысле, отвечает оптимизатор путем построения плана выполнения.

Как отработает уже построенный план, тоже зависит, но от других факторов, более низкоуровневых, например от доступной памяти на данный момент, будет ли запрос ждать ее выделения под свои нужды, или от блокировок, будет ли запрос ждать пока другие запросы их освободят и т.д.

Если останавливаться на плане, то, я так понял, ваша идея была в том, чтобы отфильтровать строки по [WareSupply].JournalDocKind = 5 как можно раньше, в результате чего, для агрегирования было бы меньше строк? Однако, из плана видно, что в результате, у вас операция группировки (Stream Aggregate) выполняется до соединения, так что ваша хитрость не прошла, вы просто нагрузили свой запрос еще одним соединением. Будет ли разница по ресурсам во время выполнения этих запросов - 100% будет, если сравнить число вызовов функций внутри сервера. Заметите ли вы это на своем оборудовании? Зависит от вашего оборудования, но скорее всего нет, о чем вы и написали, таблицы крошечные по современным меркам и железу.

Стоит ли на будущее делать такие "оптимизации" руками? Нет не стоит, если только, что-то уже работает плохо и ты знаешь или представляешь что нужно "подсказать " оптимизатору. Сервер сам по себе умеет перемещать группировку под соединение (чаще всего), над соединение (реже). Решения принимаются на основе многих факторов, например, точность оценок (актуальная статистика), информация о данных (уникальные индексы, ограничения и т.д.) - чем больше будет информации у оптимизатор о данных - тем больше у него будут развязаны руки в подобных трансформациях.
2 фев 15, 20:36    [17208974]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
SomewhereSomehow, спасибо за подробный ответ!
2 фев 15, 22:30    [17209403]     Ответить | Цитировать Сообщить модератору
 Re: Ускорит ли это подзапрос?  [new]
WareSupplyItems
Guest
minva,

индексы-то есть по полям фильтрации и соединения?
3 фев 15, 08:37    [17210137]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить