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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.11.2016, 14:12   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Как улучшить быстродействие запроса
Привет всем.
AX2012 R2.

По журналу трассировки запросов SQL вижу, что самое нагруженное место в моей Аксапте - это метод findSum на таблице IventSum
Конкретно, вот это место:

X++:
            default:
                select
                #inventSumFields
                from inventSum
                    where inventSum.ItemId      == _itemId   &&
                          inventSum.Closed      == NoYes::No
                #inventDimExistsJoin(inventSum.InventDimId,inventDim,_InventDimCriteria,_InventDimParm);
В моменты замедления работы пользователей, запрос в среднем выполняется 0,5 секунды. Но из-за того, что он вызывается многократно, получается приличная задежрка.
Проверил, индексы вроде все в порядке, в SQL Server Management Studio запрос отрабатывает моментально. Actual Execution Plan не показывает, что нужно добавить новые индексы.
По таблицам InventSum и InventDim ежедневно проводится перестроение индексов и обновление статистики.
Может, это из-за кратковременных блокировок получается задержка в 0,5 секунд ?
Старый 16.11.2016, 14:23   #2  
Freeangel is offline
Freeangel
Участник
 
173 / 55 (2) ++++
Регистрация: 01.04.2005
Посмотрите порядок полей в индексе в таблице InventSum и попробуйте поменять порядок полей в условии where согласно индексу.
За это сообщение автора поблагодарили: Ace of Database (2).
Старый 16.11.2016, 14:36   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Freeangel Посмотреть сообщение
Посмотрите порядок полей в индексе в таблице InventSum и попробуйте поменять порядок полей в условии where согласно индексу.
Проверил, в обеих таблицах последовательность полей в индексах первичного ключа совпадают с условиям where.
Селективность запросов хорошая, всего 30 комбинаций аналитик возвращают количество записей большие чем 100 (максимум - 467 записей). Большинство комбинаций аналитик дают не более 10 записей для каждой комбинации.
Старый 16.11.2016, 14:43   #4  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
А у меня в 12-ке в индексе ClosedItemDimIdx первым полем идет Closed, потом ItemId. Мне кажется это не есть хорошо.
За это сообщение автора поблагодарили: Ace of Database (2).
Старый 16.11.2016, 14:52   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
возможно стоит создать индекс на InventDim, с наиболее часто выбираемыми полями?
За это сообщение автора поблагодарили: Ace of Database (2).
Старый 16.11.2016, 15:04   #6  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Sada Посмотреть сообщение
А у меня в 12-ке в индексе ClosedItemDimIdx первым полем идет Closed, потом ItemId. Мне кажется это не есть хорошо.
В данном случае должен срабатывать индекс ItemDimIdx,
И меня там действительно смущает, что нет поля closed, но если его добавить, то нельзя оставлять индекс уникальным.
Может, создать новый неуникальный индекс, продублировать там все поля из индекса ItemDimIdx и добавить туда поле Closed ?
Старый 16.11.2016, 15:06   #7  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Вот запрос:
WHERE (((T1.PARTITION=?) AND (T1.DATAAREAID='?')) AND ((T1.ITEMID='?') AND (T1.CLOSED=?)))
Действительно проблему может решить дублирование индекса ItemDimIdx и добавление в новый индекс поле CLOSED ?
Старый 16.11.2016, 15:10   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от ice Посмотреть сообщение
возможно стоит создать индекс на InventDim, с наиболее часто выбираемыми полями?
Ок, попробую создать такой индекс: ItemId, Closed, InventDimId. На таблицу InventSum, а не InventDim.
InventDimId нужен для джойна с InventDim ( а может и не нужен, но попробую с ним)

Последний раз редактировалось Ace of Database; 16.11.2016 в 15:17.
Старый 16.11.2016, 15:17   #9  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,295 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Эскалация блокировок включена на таблицах InventSum, InventDim? Я бы отключил.
https://technet.microsoft.com/ru-ru/...=sql.105).aspx
Плюс я бы добавил индекс.
__________________
Михаил Андреев
https://www.amand.ru
За это сообщение автора поблагодарили: Ace of Database (3).
Старый 16.11.2016, 15:25   #10  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Если у вас там батчи/серийные номера используются - скороее всего, индексами делу не поможешь. Попробуй в этот метод НЕНАДОЛГО воткнуть forceliterals и потом посмотри по каким номенклатурам самые тяжелые запросы. (Forceliterals надо откатить потом - это просто способ диангостики).
У меня была похожая ситуация на одном из клиентов. Там было с десяток ключевых номенклатур, по каждой из которых было порядка 10-20 тысяч батчей и, соответственно, порядка 50-100 тысяч записей в inventSum.
Удалось как-то сдвинуть ситуацию только построив за пределами Аксапты index clustered view, полученный запихиванием этого запроса в Database Tuning Advisor. Метод не очень надежный, но у них там уже речь шла не о 0.5 секунды, а о секундах 5-7...
Старый 16.11.2016, 15:48   #11  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от fed Посмотреть сообщение
Удалось как-то сдвинуть ситуацию только построив за пределами Аксапты index clustered view, полученный запихиванием этого запроса в Database Tuning Advisor. Метод не очень надежный, но у них там уже речь шла не о 0.5 секунды, а о секундах 5-7...
Сурово Тогда уж лучше, мне кажется, продублировать складские аналитики в InventSum и играться на ней с индексами под различные наборы. Тем более в АХ 2012 можно добавлять Include-поля и творить покрывающие индексы не утыкаясь в ограничение в 16 полей. Вроде допиливать придется не так и много.
Старый 16.11.2016, 16:05   #12  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от Sada Посмотреть сообщение
А у меня в 12-ке в индексе ClosedItemDimIdx первым полем идет Closed, потом ItemId. Мне кажется это не есть хорошо.
Я его вообще изничтожил, т.к. SQL отказывался его пользовать.
Стандартные неиспользуемые индексы
За это сообщение автора поблагодарили: Logger (1), Ace of Database (2).
Старый 16.11.2016, 16:17   #13  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от fed Посмотреть сообщение
Если у вас там батчи/серийные номера используются - скороее всего, индексами делу не поможешь. Попробуй в этот метод НЕНАДОЛГО воткнуть forceliterals и потом посмотри по каким номенклатурам самые тяжелые запросы. (Forceliterals надо откатить потом - это просто способ диангостики).
У меня была похожая ситуация на одном из клиентов. Там было с десяток ключевых номенклатур, по каждой из которых было порядка 10-20 тысяч батчей и, соответственно, порядка 50-100 тысяч записей в inventSum.
Удалось как-то сдвинуть ситуацию только построив за пределами Аксапты index clustered view, полученный запихиванием этого запроса в Database Tuning Advisor. Метод не очень надежный, но у них там уже речь шла не о 0.5 секунды, а о секундах 5-7...
У меня по одной номенклатуре не более 400 партий. И то таких не больше 10- штук. В основном не больше 10 партий на одну номенклатуру.
Посчитал : в среднем 72 партии (уникальных комбинаций аналитик) на одну номенклатуру.

Последний раз редактировалось Ace of Database; 16.11.2016 в 16:26.
Старый 16.11.2016, 16:23   #14  
Freeangel is offline
Freeangel
Участник
 
173 / 55 (2) ++++
Регистрация: 01.04.2005
Создайте свой индекс и добавьте index hint для этого запроса. И посмотрите, что получится.
Старый 16.11.2016, 16:39   #15  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Михаил Андреев Посмотреть сообщение
Эскалация блокировок включена на таблицах InventSum, InventDim? Я бы отключил.
https://technet.microsoft.com/ru-ru/...=sql.105).aspx
Плюс я бы добавил индекс.
Спасибо, попробую. И индекс добавлю. Надо сначала морально подготовиться, а потом сделать. Заметил, что лучше работает тогда, когда делаешь не сразу после принятия решения, а через несколько дней.
Тем более, что пока особенно народ не жалуется.
Старый 16.11.2016, 16:56   #16  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Alexius Посмотреть сообщение
Сурово Тогда уж лучше, мне кажется, продублировать складские аналитики в InventSum и играться на ней с индексами под различные наборы. Тем более в АХ 2012 можно добавлять Include-поля и творить покрывающие индексы не утыкаясь в ограничение в 16 полей. Вроде допиливать придется не так и много.
Так проблема не в том что на джойн время много уходит, проблема в том что суммировать дофига записей. То есть - там сам джойн процентов 15-20 времени запроса занимает. А вот суммировать 100000 записей - дело не быстрое. Так что добавлением аналитик в таких ситуациях не поможешь. А cluster indexed view и используется тогда, когда надо заранее подбить суммы по каким-то сочетаниям полей. При этом если в исходном запросе аггрегатные функции не использются, то этот cluster indexed view и не даст особого ускорения. К слову сказать, по моему Database Tuning Advisor выдает рекомендации по cluster indexed view ТОЛЬКО для запросов с аггрегированием.
Кстати - как топикстартер верно заметил - это точно не его случай. У него там что-то другое происходит.
Старый 16.11.2016, 17:24   #17  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Если запросы тормозит не всегда, а после какого-то времени или время от времени, то можно поэкспериментировать с процедурным кэшем. Для начала попробовать его сбросить DBCC FREEPROCCACHE.
Еще на БД есть свойство PARAMETERIZATION, если его установить в FORCED, то сервер не будет кэшировать планы для каждого набора параметров запросов.
Ну и на закуску возможно неплохо бы отключить параллелизм на сервере, если в MS SQL 2012 я пока не встречал "паразитных" распараллеливаний запросов, то на более древних версиях они могли укладывать не самые хилые дисковые подсистемы.
Старый 16.11.2016, 18:42   #18  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от fed Посмотреть сообщение
А вот суммировать 100000 записей - дело не быстрое. Так что добавлением аналитик в таких ситуациях не поможешь. А cluster indexed view и используется тогда, когда надо заранее подбить суммы по каким-то сочетаниям полей.
кстати имел негативный опыт играясь с cluster indexed view как раз для такого запроса - т.е. сам запрос заметно ускорялся но при этом вставка в InventDim и InventSum замедлялась на такое же время
из текста кстати непонтяно что за запрос - какие поля выбираются, еще из универсальных советов можно попробовать почистить InventSum от нулевых значений(closed=1)

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

Последний раз редактировалось trud; 16.11.2016 в 18:45.
Старый 17.11.2016, 09:09   #19  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от trud Посмотреть сообщение
кстати имел негативный опыт играясь с cluster indexed view как раз для такого запроса - т.е. сам запрос заметно ускорялся но при этом вставка в InventDim и InventSum замедлялась на такое же время
Я на эту граблю тоже наступал и достаточно легко ее обошел. Надо выловить из кэша запросов план того самого тормозящего запроса с update по inventSum и построить индекс, который в этом самом плане рекомендован. (То есть - даже Tuning Advisor запускать не надо). Единственное know how - порядок полей в индексе надо строго соблюдать, засовывая dataAreaId на второе или третье место. В противном случае - индекс не срабатывает.
Ну и да - согласен, в исходном вопросе не хватает данных. Не понятно что за запрос и с какой целью идет. В идеале, надо было бы его выловить в кэше запросов на SQL Server и выложить сюда план. Странно что запрос так медленно работает при таких скромных объемах.
Старый 21.11.2016, 17:40   #20  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Быстрее всего работает запрос, который вообще не надо выполнять. Может в findSum() приделать кэширование?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Всегда ли правильно работает queryrun().query().dataSourceCount() при присоединении пользователем таблиц в настройках стандартного запроса? Aquarius DAX: Программирование 5 26.09.2013 09:52
Изменить план выполнения запроса Sequel DAX: Администрирование 2 29.05.2008 15:46
Быстродействие запроса Antonuch DAX: Программирование 1 25.01.2008 15:58
Журнал трассировки операторов SQL - План запроса в "вопросах" vesna dba DAX: Администрирование 4 26.06.2007 11:59
Ускорение выполнения запроса Oracle + MS Axapta Горбунов Дмитрий DAX: Программирование 17 15.11.2005 18:13

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:10.