AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Администрирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.02.2019, 21:35   #1  
skycap is offline
skycap
Участник
 
43 / 14 (1) ++
Регистрация: 04.09.2008
Адрес: Москва
Angry AX 2012 R3, SQL 2012, InventSum+InventDim оптимизация
Люди добрые, здравствуйте.

Работаем c R3, с WHS. Работаем давно, практически с момента выхода этой функциональности.

Помогите разобраться с проблемкой. Для начала, если в общем, проблема в том, что периодически (несколько раз в день) стандартный запрос к InventSum в связке с InventDim начинает выполняться долго, точнее, ОЧЕНЬ ДОЛГО, со всеми вытекающими.

InventSum - 3,5 млн записей, InventDim - 35 млн.

Говоря про стандартный запрос я имею ввиду метод findSumQty на таблице InventSum.

X++:
select
        #inventSumQtyFields
        from inventSum
            where inventSum.ItemId      == _itemId
               && inventSum.ClosedQty   == NoYes::No
        #inventDimExistsJoin(inventSum.InventDimId,inventDim,_InventDimCriteria,_InventDimParm);
        //#InventDimJoin(inventSum.InventDimId,inventDim,_InventDimCriteria,_InventDimParm);
В стандарте InventDim джойнится к InventSum через exists join. На начальном этапе запуска exists join поменяли на join tableId (вместо макроса #inventDimExistsJoin использовали #InventDimJoin).
И вроде все было хорошо, пока в какой-то момент времени запрос периодически не начал тормозить (не всегда, но бывало). В целях эксперимента вернули стандартный exists join и оно полетело. Довольные своей сообразительностью, оставили стандартный вариант.
Никогда такого не было и вот опять. Начал тормозить уже exists join. Менять обратно на join пока не стали - наблюдаем дальше.
Лечим сбросом кэша - dbcc freeproccache, да, плохо, знаем, но пока других вариантов не придумали.

Вот сам запрос из SQL MS и план запроса, меня настораживает в нем KeyLookup. Запрос взял из SQL MS в тот момент когда было все плохо, таких запросов в статусе SUSPENDED там было бесчисленное множество.

Код:
SELECT SUM(T1.POSTEDQTY),
SUM(T1.DEDUCTED),
SUM(T1.RECEIVED),
SUM(T1.RESERVPHYSICAL),
SUM(T1.RESERVORDERED),
SUM(T1.REGISTERED),
SUM(T1.PICKED),
SUM(T1.ONORDER),
SUM(T1.ORDERED),
SUM(T1.ARRIVED),
SUM(T1.QUOTATIONRECEIPT),
SUM(T1.QUOTATIONISSUE),
SUM(T1.AVAILPHYSICAL),
SUM(T1.AVAILORDERED),
SUM(T1.PHYSICALINVENT) FROM INVENTSUM 
T1 WHERE (((T1.PARTITION=@P1) AND (T1.DATAAREAID=N'lm')) 
AND ((T1.ITEMID=@P2)
AND (T1.CLOSEDQTY=@P3))) 
AND EXISTS (SELECT 'x' FROM INVENTDIM T2 
WHERE (((T2.PARTITION=@P4) AND (T2.DATAAREAID=N'lm')) 
AND ((((((((((((((((T2.INVENTDIMID=T1.INVENTDIMID) AND 1=@P5) AND 1=@P6) AND 1=@P7) AND 1=@P8) 
AND (T2.INVENTSITEID=@P9))
AND (T2.INVENTLOCATIONID=@P10))
AND (T2.WMSLOCATIONID=@P11))
AND (T2.LICENSEPLATEID=@P12))
AND (T2.INVENTSTATUSID=@P13))
AND (T2.INVENTGTDID_RU=@P14))
AND (T2.INVENTOWNERID_RU=@P15))
AND (T2.INVENTCULTIVARID=@P16))
AND (T2.INVENTMARKETINGID=@P17))
AND (T2.INVENTCOUNTRYID=@P18))
AND (T2.INVENTTRACKID=@P19))))
Не пойму откуда это взялось
Код:
AND 1=@P5) AND 1=@P6) AND 1=@P7) AND 1=@P8)


На таблице InventDim с другого проекта перекочевали индексы, которые у нас не используются, сами индексы кастомизированы, вот 2, которые из плана запроса



В общем конкретного вопроса нет. Расскажите кто как решал такие проблемы. Тапками сразу не бросайте, топики на эту тему на форуме я почитал. Рекомендации разные - использовать join вместо exists join, индексы напильником подпилить.

План обслуживания индексов у нас настроен, выполняется каждую ночь. Периодические операции по очистке неиспользуемых аналитик + очистка записей InventSum+WHSInventReserve выполняются.
Миниатюры
Нажмите на изображение для увеличения
Название: query plan.png
Просмотров: 1123
Размер:	49.7 Кб
ID:	12211  
Изображения
 
Старый 10.02.2019, 21:55   #2  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
На таблице InventDim с другого проекта перекочевали индексы, которые у нас не используются,
Отключить их через AOT свойство Disabled?
Старый 10.02.2019, 21:57   #3  
skycap is offline
skycap
Участник
 
43 / 14 (1) ++
Регистрация: 04.09.2008
Адрес: Москва
Пока перечитывал тему анализировал параллельно таблицу аналитик и увидел, что
в таблице InventDim в индексе DimIdx нет аналитик (это продуктовые аналитики), которые указаны в плане запроса в KeyLookup.
INVENTCULTIVARID
INVENTMARKETINGID
INVENTCOUNTRYID

Следует ли из этого что эти аналитики нужно добавить в индекс DimIdx?

Более того эти аналитики мы не используем в принципе. Может удалить их вообще тогда если от этого будет легче.
Старый 10.02.2019, 21:59   #4  
skycap is offline
skycap
Участник
 
43 / 14 (1) ++
Регистрация: 04.09.2008
Адрес: Москва
Цитата:
Отключить их через AOT свойство Disabled?
Да, они уже отключены. Спасибо.
Старый 10.02.2019, 22:28   #5  
kgksoft is offline
kgksoft
Участник
 
37 / 107 (4) +++++
Регистрация: 24.12.2003
InventSum - 47 млн
InventDim - 76 млн
WHSINVENTRESERVE - 43 млн

У себя решаем:
1.Регулярным (каждый день) пересчетом статистики по InventSum, InventDim, WHSINVENTRESERVE + FREEPROCCACHE + FREESYSTEMCACHE
2. Прибиванием планов запросов через PlanGuide
3. ExistJoin -> InnerJoin
4. Написал новый класс для работы с остатками через WHSINVENTRESERVE+ InventDim - без использования страшной stored-procedure. Для кастомных расчетов все летает. + Как плюшки остатки (физ.+доступное кол-во) возвращаю как массив с указанной группировкой InventDim
Старый 11.02.2019, 07:07   #6  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от kgksoft Посмотреть сообщение
У себя решаем:
1.Регулярным (каждый день) пересчетом статистики по InventSum, InventDim, WHSINVENTRESERVE + FREEPROCCACHE + FREESYSTEMCACHE
А статистику зачем пересчитывать? т.е. распределение данных при таких объемах вряд-ли меняется часто

Цитата:
Сообщение от kgksoft Посмотреть сообщение
4. Написал новый класс для работы с остатками через WHSINVENTRESERVE+ InventDim - без использования страшной stored-procedure. Для кастомных расчетов все летает. + Как плюшки остатки (физ.+доступное кол-во) возвращаю как массив с указанной группировкой InventDim
Why Don't You Contribute to Open Source?
https://www.yegor256.com/2015/12/22/...en-source.html

По теме - вам нужно начать с того, чтобы понять какие данные вызывают эти проблемы, т.е. что скрывается под этими @P11.. и почему это занимает много времени(одна то строчка должна выбираться быстро - при условии конечно что сервер не перегружен)

Если это parameters sniffing то можно или прописывать планы PlanGuides или поставить forceliterals если на сервере есть ресурсы для этого
https://denistrunin.com/forceliteral...ePlaceholders/
Старый 11.02.2019, 07:53   #7  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Иногда можно чистить InventDim:
Цитата:
Inventory and warehouse management > Periodic > Clean up > Inventory dimensions cleanup
Хотя бы избавитесь от нескольких млн записей, которые не используются в системе.
__________________
// no comments
Старый 11.02.2019, 08:36   #8  
skycap is offline
skycap
Участник
 
43 / 14 (1) ++
Регистрация: 04.09.2008
Адрес: Москва
Цитата:
Иногда можно чистить InventDim
И это делаем. Периодические операции по очистке неиспользуемых аналитик + очистка записей InventSum+WHSInventReserve выполняются.
Старый 11.02.2019, 08:40   #9  
skycap is offline
skycap
Участник
 
43 / 14 (1) ++
Регистрация: 04.09.2008
Адрес: Москва
Цитата:
Если это parameters sniffing то можно или прописывать планы PlanGuides или поставить forceliterals если на сервере есть ресурсы для этого
https://denistrunin.com/forceliteral...ePlaceholders/
Спасибо, почитаем.
Старый 11.02.2019, 09:24   #10  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от skycap Посмотреть сообщение
Пока перечитывал тему анализировал параллельно таблицу аналитик и увидел, что
в таблице InventDim в индексе DimIdx нет аналитик (это продуктовые аналитики), которые указаны в плане запроса в KeyLookup.
INVENTCULTIVARID
INVENTMARKETINGID
INVENTCOUNTRYID

Следует ли из этого что эти аналитики нужно добавить в индекс DimIdx?

Более того эти аналитики мы не используем в принципе. Может удалить их вообще тогда если от этого будет легче.
Удалить !!!
Старый 11.02.2019, 10:48   #11  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от skycap Посмотреть сообщение
Не пойму откуда это взялось
Код:
AND 1=@P5) AND 1=@P6) AND 1=@P7) AND 1=@P8)
Связь и фильтры по InventDim - это из макроса #InventDimExistsJoin или вложенного в него макроса #InventDimDevelop. Вот и смотрите, что у Вас в них написано. Вероятно, какая-то модификация сделана
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 11.02.2019, 11:28   #12  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Сталкивался с подобным. Когда запрос выдает пустое значение - он тормозит безбожно.
Я нашел в классе InventUpd_Financial метод protected CostAmountSecCur_RU updateFinancialIssue(CostAmount costAmountMST, CostAmountSecCur_RU _costAmountSecCur)
подправил в этом месте:
X++:
            inventTrans.update();
//BAH250 16.08.2018 ->
            if (movement.inventModelType().stdCostBased())  //BAH250 16.08.2018 <-
                this.updateInventOnhandFinancialCache(inventTrans);
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!
За это сообщение автора поблагодарили: ax_mct (3).
Старый 11.02.2019, 18:34   #13  
nnrvsn is offline
nnrvsn
Участник
 
18 / 11 (1) +
Регистрация: 16.02.2012
Пару месяцев назад решал подобную проблему.

Пробовали кастомные планы, freeprocchache итд, но рано поздно (рано) все равно начинает тормзить. Вылечилось добавлением forceLiterals в селектах в InventSum::findSum.

Еще можно попробовать бубны из блога:
https://blogs.msdn.microsoft.com/axs...eserve-tables/
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX Sustained Engineering: Announcing support for SQL Server 2012 SP3 with AX 2012 R2 & R3 Blog bot DAX Blogs 0 09.03.2016 10:11
DAX: Calling all developers: how to ease the learning curve of Microsoft Dynamics AX 2012 R3 Blog bot DAX Blogs 0 27.08.2014 22:11
axsa: MDM Adapter - Extending Dynamics AX 2012 R3 Master Data Management Blog bot DAX Blogs 0 22.05.2014 03:28
DAX: Official Dynamics AX 2012 R2 Content (update) - Where is it, and how can you find out about updates? Blog bot DAX Blogs 0 03.12.2012 11:11
axinthefield: Dynamics AX Event IDs Blog bot DAX Blogs 0 01.03.2011 22:11
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:29.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.