16.11.2016, 14:12 | #1 |
Участник
|
Как улучшить быстродействие запроса
Привет всем.
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); Проверил, индексы вроде все в порядке, в SQL Server Management Studio запрос отрабатывает моментально. Actual Execution Plan не показывает, что нужно добавить новые индексы. По таблицам InventSum и InventDim ежедневно проводится перестроение индексов и обновление статистики. Может, это из-за кратковременных блокировок получается задержка в 0,5 секунд ? |
|
16.11.2016, 14:23 | #2 |
Участник
|
Посмотрите порядок полей в индексе в таблице InventSum и попробуйте поменять порядок полей в условии where согласно индексу.
|
|
|
За это сообщение автора поблагодарили: Ace of Database (2). |
16.11.2016, 14:36 | #3 |
Участник
|
Цитата:
Селективность запросов хорошая, всего 30 комбинаций аналитик возвращают количество записей большие чем 100 (максимум - 467 записей). Большинство комбинаций аналитик дают не более 10 записей для каждой комбинации. |
|
16.11.2016, 14:43 | #4 |
Программатор
|
А у меня в 12-ке в индексе ClosedItemDimIdx первым полем идет Closed, потом ItemId. Мне кажется это не есть хорошо.
|
|
|
За это сообщение автора поблагодарили: Ace of Database (2). |
16.11.2016, 14:52 | #5 |
Участник
|
возможно стоит создать индекс на InventDim, с наиболее часто выбираемыми полями?
|
|
|
За это сообщение автора поблагодарили: Ace of Database (2). |
16.11.2016, 15:04 | #6 |
Участник
|
Цитата:
И меня там действительно смущает, что нет поля closed, но если его добавить, то нельзя оставлять индекс уникальным. Может, создать новый неуникальный индекс, продублировать там все поля из индекса ItemDimIdx и добавить туда поле Closed ? |
|
16.11.2016, 15:06 | #7 |
Участник
|
Вот запрос:
WHERE (((T1.PARTITION=?) AND (T1.DATAAREAID='?')) AND ((T1.ITEMID='?') AND (T1.CLOSED=?))) Действительно проблему может решить дублирование индекса ItemDimIdx и добавление в новый индекс поле CLOSED ? |
|
16.11.2016, 15:10 | #8 |
Участник
|
Цитата:
InventDimId нужен для джойна с InventDim ( а может и не нужен, но попробую с ним) Последний раз редактировалось Ace of Database; 16.11.2016 в 15:17. |
|
16.11.2016, 15:17 | #9 |
Участник
|
Эскалация блокировок включена на таблицах InventSum, InventDim? Я бы отключил.
https://technet.microsoft.com/ru-ru/...=sql.105).aspx Плюс я бы добавил индекс. |
|
|
За это сообщение автора поблагодарили: Ace of Database (3). |
16.11.2016, 15:25 | #10 |
Moderator
|
Если у вас там батчи/серийные номера используются - скороее всего, индексами делу не поможешь. Попробуй в этот метод НЕНАДОЛГО воткнуть forceliterals и потом посмотри по каким номенклатурам самые тяжелые запросы. (Forceliterals надо откатить потом - это просто способ диангостики).
У меня была похожая ситуация на одном из клиентов. Там было с десяток ключевых номенклатур, по каждой из которых было порядка 10-20 тысяч батчей и, соответственно, порядка 50-100 тысяч записей в inventSum. Удалось как-то сдвинуть ситуацию только построив за пределами Аксапты index clustered view, полученный запихиванием этого запроса в Database Tuning Advisor. Метод не очень надежный, но у них там уже речь шла не о 0.5 секунды, а о секундах 5-7... |
|
16.11.2016, 15:48 | #11 |
Участник
|
Сурово Тогда уж лучше, мне кажется, продублировать складские аналитики в InventSum и играться на ней с индексами под различные наборы. Тем более в АХ 2012 можно добавлять Include-поля и творить покрывающие индексы не утыкаясь в ограничение в 16 полей. Вроде допиливать придется не так и много.
|
|
16.11.2016, 16:05 | #12 |
Участник
|
Цитата:
Стандартные неиспользуемые индексы |
|
|
За это сообщение автора поблагодарили: Logger (1), Ace of Database (2). |
16.11.2016, 16:17 | #13 |
Участник
|
Цитата:
Сообщение от fed
Если у вас там батчи/серийные номера используются - скороее всего, индексами делу не поможешь. Попробуй в этот метод НЕНАДОЛГО воткнуть forceliterals и потом посмотри по каким номенклатурам самые тяжелые запросы. (Forceliterals надо откатить потом - это просто способ диангостики).
У меня была похожая ситуация на одном из клиентов. Там было с десяток ключевых номенклатур, по каждой из которых было порядка 10-20 тысяч батчей и, соответственно, порядка 50-100 тысяч записей в inventSum. Удалось как-то сдвинуть ситуацию только построив за пределами Аксапты index clustered view, полученный запихиванием этого запроса в Database Tuning Advisor. Метод не очень надежный, но у них там уже речь шла не о 0.5 секунды, а о секундах 5-7... Посчитал : в среднем 72 партии (уникальных комбинаций аналитик) на одну номенклатуру. Последний раз редактировалось Ace of Database; 16.11.2016 в 16:26. |
|
16.11.2016, 16:23 | #14 |
Участник
|
Создайте свой индекс и добавьте index hint для этого запроса. И посмотрите, что получится.
|
|
16.11.2016, 16:39 | #15 |
Участник
|
Цитата:
Сообщение от Михаил Андреев
Эскалация блокировок включена на таблицах InventSum, InventDim? Я бы отключил.
https://technet.microsoft.com/ru-ru/...=sql.105).aspx Плюс я бы добавил индекс. Тем более, что пока особенно народ не жалуется. |
|
16.11.2016, 16:56 | #16 |
Moderator
|
Цитата:
Сообщение от Alexius
Сурово Тогда уж лучше, мне кажется, продублировать складские аналитики в InventSum и играться на ней с индексами под различные наборы. Тем более в АХ 2012 можно добавлять Include-поля и творить покрывающие индексы не утыкаясь в ограничение в 16 полей. Вроде допиливать придется не так и много.
Кстати - как топикстартер верно заметил - это точно не его случай. У него там что-то другое происходит. |
|
16.11.2016, 17:24 | #17 |
Участник
|
Если запросы тормозит не всегда, а после какого-то времени или время от времени, то можно поэкспериментировать с процедурным кэшем. Для начала попробовать его сбросить DBCC FREEPROCCACHE.
Еще на БД есть свойство PARAMETERIZATION, если его установить в FORCED, то сервер не будет кэшировать планы для каждого набора параметров запросов. Ну и на закуску возможно неплохо бы отключить параллелизм на сервере, если в MS SQL 2012 я пока не встречал "паразитных" распараллеливаний запросов, то на более древних версиях они могли укладывать не самые хилые дисковые подсистемы. |
|
16.11.2016, 18:42 | #18 |
Участник
|
Цитата:
из текста кстати непонтяно что за запрос - какие поля выбираются, еще из универсальных советов можно попробовать почистить InventSum от нулевых значений(closed=1) вообще перед тем как что-то оптимизировать лучше сперва понять цель запроса и кол-во выбираемых данных. может оказаться что надо не индексы делать, а настройки групп моделей менять Последний раз редактировалось trud; 16.11.2016 в 18:45. |
|
17.11.2016, 09:09 | #19 |
Moderator
|
Цитата:
Ну и да - согласен, в исходном вопросе не хватает данных. Не понятно что за запрос и с какой целью идет. В идеале, надо было бы его выловить в кэше запросов на SQL Server и выложить сюда план. Странно что запрос так медленно работает при таких скромных объемах. |
|
21.11.2016, 17:40 | #20 |
Administrator
|
Быстрее всего работает запрос, который вообще не надо выполнять. Может в findSum() приделать кэширование?
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
|