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

Откуда:
Сообщений: 2808
Изначально задача - сделать быстрый по скорости отчет остатки по складам на выбранную дату.

Есть индексированная вьюха с движениями по складу, есть таблица снимок остатков на складе на каждое 1е число месяца. Обе таблицы партицированы по дате, одна партиция это от начала месяца включительно дата до конца месяца. Сделано для того, что бы индекс при расчете нарастающего итога "красиво работал по интересующей части".

exec sp_helpindex 'stage.v_ОстаткиНаСкладе'
exec sp_helpindex 'stage.t_ОстаткиНаСкладеСрез'

index_name    index_description                        index_keys
------------- ---------------------------------------- --------------------------------------------------------------
ix1 clustered, unique located on ps_Дата Склад, Груз, ГородПолучатель, ТипОстатков, Период

index_name index_description index_keys
------------- ---------------------------------------- --------------------------------------------------------------
ix1 clustered, unique located on ps_Дата ДатаСреза, Склад, Груз, ГородПолучатель, ТипОстатков, Период


Запрос с планом в рисунке. Как можно еще убыстрить этот запрос???? Время расчета на "сегодня" занимает порядка 5 минут. А нужно что бы максимум секунд 30 отчет выполнялся... Уже фантазии не хватает. Какие идеи будут?

К сообщению приложен файл. Размер - 119Kb
28 мар 16, 14:14    [18986338]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Дед-Папыхтет,

я вообщем-то не тестировал план, но может оконные функции просто на GROUP BY заменить? заодно и потестируете :)
28 мар 16, 14:21    [18986402]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
TaPaK
Дед-Папыхтет,

я вообщем-то не тестировал план, но может оконные функции просто на GROUP BY заменить? заодно и потестируете :)

Всмысле??? Нарастающий итог считать джоин на себя и гроуп бай? )
28 мар 16, 14:23    [18986420]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
Дед-Папыхтет,

следпериод в NULL зачем фильтруете? Сразу ищите максимальный. Вы выбрасываете в конце почти 3/4 строк.
28 мар 16, 14:24    [18986427]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Владислав Колосов
Дед-Папыхтет,

следпериод в NULL зачем фильтруете? Сразу ищите максимальный. Вы выбрасываете в конце почти 3/4 строк.

Нужны последние данные внутри Склад, Груз, ГородПолучатель, ТипОстатков. Сначала была идея
row_number() over (partition by Склад, Груз, ГородПолучатель, ТипОстатков order by Период desc) и после фильтрация =1. Но индекс этот не будет работать - тяжелее намного получается. А следующий lead красиво ложится в этот индекс
28 мар 16, 14:26    [18986444]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Владислав Колосов
Дед-Папыхтет,

следпериод в NULL зачем фильтруете? Сразу ищите максимальный. Вы выбрасываете в конце почти 3/4 строк.

И последние данные != максимальные...
На склад могут приходить грузы могут и уходить со склада..
28 мар 16, 14:27    [18986454]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
Дед-Папыхтет,

Вы же видите, что махдоп не работает. По-моему как раз из-за lead.
28 мар 16, 14:29    [18986474]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
а зачем noexpand на view?
28 мар 16, 14:31    [18986497]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Konst_One
а зачем noexpand на view?

Что бы не было соблазна у оптимизатора лезть в текст вьюхи )))), а использовать кластерный индекс этой вьюхи
28 мар 16, 14:33    [18986507]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
тогда делайте ХП и в ней собирайте временную таблицу из вашего запроса по каждому из складов, явно индекс будет уже работать
28 мар 16, 14:34    [18986524]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Владислав Колосов
Дед-Папыхтет,

Вы же видите, что махдоп не работает. По-моему как раз из-за lead.

Не из-за лид это точно... Лид дал дополнительный виндов спул и все по сути... это всяко лучше чем сортировка не по индексу...

К сообщению приложен файл. Размер - 112Kb
28 мар 16, 14:35    [18986528]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Дед-Папыхтет,

Зачем нарастающий итог, если берутся только последние значения?
28 мар 16, 14:40    [18986562]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
invm
Дед-Папыхтет,

Зачем нарастающий итог, если берутся только последние значения?


Ну ок. Предположим на каком то складе какой то груз


Дата Количество НарастающийКоличество
01.01.16 3 3
02.01.16 -1 2
03.01.16 2 4

Мне например если нужно на 02.01.16 дату, мне нужно выводить же остаток = НарастающийИтог а не количество операции. Т.е. результат должен быть 2, а не -1
28 мар 16, 14:52    [18986654]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Дед-Папыхтет
мне нужно выводить же остаток = НарастающийИтог а не количество операции
Вам нужно выводить сумму количеств (3 + -1 = 2). Нарастающий итог зачем?
28 мар 16, 14:56    [18986683]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
invm
Дед-Папыхтет
мне нужно выводить же остаток = НарастающийИтог а не количество операции
Вам нужно выводить сумму количеств (3 + -1 = 2). Нарастающий итог зачем?

Кстати да....
Ща заменю ка
+ это
		select
			 Склад
			,Груз
			,ГородПолучатель
			,ТипОстатков
			,Период
			,Количество	= sum(Количество)	over (partition by Склад,Груз,ГородПолучатель,ТипОстатков order by Период)
			,Объем		= sum(Объем)		over (partition by Склад,Груз,ГородПолучатель,ТипОстатков order by Период)
			,ОбъемСЖУ	= sum(ОбъемСЖУ)		over (partition by Склад,Груз,ГородПолучатель,ТипОстатков order by Период)
			,Вес		= sum(Вес)			over (partition by Склад,Груз,ГородПолучатель,ТипОстатков order by Период)
			--,СледПериод	= lead(Период)		over (partition by Склад,Груз,ГородПолучатель,ТипОстатков order by Период)
		from objedenim

+ на это
		select
			 Склад
			,Груз
			,ГородПолучатель
			,ТипОстатков
			,Период		= max(Период)
			,Количество	= sum(Количество)
			,Объем		= sum(Объем)
			,ОбъемСЖУ	= sum(ОбъемСЖУ)
			,Вес		= sum(Вес)
			--,СледПериод	= lead(Период)		over (partition by Склад,Груз,ГородПолучатель,ТипОстатков order by Период)
		from objedenim
		group by
			 Склад
			,Груз
			,ГородПолучатель
			,ТипОстатков

Отпишусь. Очевидно вроде не увидел сразу )))). Нарастающий итог еще нужен был для других задач - требовалась вьюха для ОЛАП которая все бы значения полностью вываливала.
28 мар 16, 15:04    [18986738]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
invm,

Ура - 30 секунд стало! ))))
Еще раз спасибо - очевидного не увидел сразу

К сообщению приложен файл. Размер - 39Kb
28 мар 16, 15:09    [18986768]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Дед-Папыхтет,

автор
Ура - 30 секунд стало! ))))
Еще раз спасибо - очевидного не увидел сразу

ну вот и потестировал
28 мар 16, 15:11    [18986776]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Дед-Папыхтет
Еще раз спасибо - очевидного не увидел сразу
Ну так вам первым же ответом и намекали - 18986402 ;)
28 мар 16, 15:16    [18986801]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
один раз бы вычислили свои остатки и записали бы в постоянную таблицу, а к ней уже бы отчёты свои лепили
28 мар 16, 15:16    [18986804]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Konst_One
один раз бы вычислили свои остатки и записали бы в постоянную таблицу, а к ней уже бы отчёты свои лепили

так и было изначально, но мы имели остатки текущие. Возникла задача сделать остатки на заданную дату.
28 мар 16, 15:29    [18986884]     Ответить | Цитировать Сообщить модератору
 Re: Что еще можно придумать что бы оптимизировать запрос?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
сделайте OLAP-хранилище и процесьте куб, чтобы актуальность поддерживать. вам тут не нужен онлайн. это же фактические итоги по складам
28 мар 16, 15:34    [18986907]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить