|
|
#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 секунд ? |
|
|
|
|
#2 |
|
Участник
|
Посмотрите порядок полей в индексе в таблице InventSum и попробуйте поменять порядок полей в условии where согласно индексу.
|
|
|
|
| За это сообщение автора поблагодарили: Ace of Database (2). | |
|
|
#3 |
|
Участник
|
Цитата:
Селективность запросов хорошая, всего 30 комбинаций аналитик возвращают количество записей большие чем 100 (максимум - 467 записей). Большинство комбинаций аналитик дают не более 10 записей для каждой комбинации. |
|
|
|
|
#4 |
|
Программатор
|
А у меня в 12-ке в индексе ClosedItemDimIdx первым полем идет Closed, потом ItemId. Мне кажется это не есть хорошо.
|
|
|
|
| За это сообщение автора поблагодарили: Ace of Database (2). | |
|
|
#5 |
|
Участник
|
возможно стоит создать индекс на InventDim, с наиболее часто выбираемыми полями?
|
|
|
|
| За это сообщение автора поблагодарили: Ace of Database (2). | |
|
|
#6 |
|
Участник
|
Цитата:
И меня там действительно смущает, что нет поля closed, но если его добавить, то нельзя оставлять индекс уникальным. Может, создать новый неуникальный индекс, продублировать там все поля из индекса ItemDimIdx и добавить туда поле Closed ? |
|
|
|
|
#7 |
|
Участник
|
Вот запрос:
WHERE (((T1.PARTITION=?) AND (T1.DATAAREAID='?')) AND ((T1.ITEMID='?') AND (T1.CLOSED=?))) Действительно проблему может решить дублирование индекса ItemDimIdx и добавление в новый индекс поле CLOSED ? |
|
|
|
|
#8 |
|
Участник
|
Цитата:
InventDimId нужен для джойна с InventDim ( а может и не нужен, но попробую с ним) Последний раз редактировалось Ace of Database; 16.11.2016 в 15:17. |
|
|
|
|
#9 |
|
Участник
|
Эскалация блокировок включена на таблицах InventSum, InventDim? Я бы отключил.
https://technet.microsoft.com/ru-ru/...=sql.105).aspx Плюс я бы добавил индекс. |
|
|
|
| За это сообщение автора поблагодарили: Ace of Database (3). | |
|
|
#10 |
|
Moderator
|
Если у вас там батчи/серийные номера используются - скороее всего, индексами делу не поможешь. Попробуй в этот метод НЕНАДОЛГО воткнуть forceliterals и потом посмотри по каким номенклатурам самые тяжелые запросы. (Forceliterals надо откатить потом - это просто способ диангостики).
У меня была похожая ситуация на одном из клиентов. Там было с десяток ключевых номенклатур, по каждой из которых было порядка 10-20 тысяч батчей и, соответственно, порядка 50-100 тысяч записей в inventSum. Удалось как-то сдвинуть ситуацию только построив за пределами Аксапты index clustered view, полученный запихиванием этого запроса в Database Tuning Advisor. Метод не очень надежный, но у них там уже речь шла не о 0.5 секунды, а о секундах 5-7... |
|
|
|
|
#11 |
|
Участник
|
Цитата:
Тогда уж лучше, мне кажется, продублировать складские аналитики в InventSum и играться на ней с индексами под различные наборы. Тем более в АХ 2012 можно добавлять Include-поля и творить покрывающие индексы не утыкаясь в ограничение в 16 полей. Вроде допиливать придется не так и много.
|
|
|
|
|
#12 |
|
Участник
|
Цитата:
Стандартные неиспользуемые индексы |
|
|
|
| За это сообщение автора поблагодарили: Logger (1), Ace of Database (2). | |
|
|
#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. |
|
|
|
|
#14 |
|
Участник
|
Создайте свой индекс и добавьте index hint для этого запроса. И посмотрите, что получится.
|
|
|
|
|
#15 |
|
Участник
|
Цитата:
Сообщение от Михаил Андреев
Эскалация блокировок включена на таблицах InventSum, InventDim? Я бы отключил.
https://technet.microsoft.com/ru-ru/...=sql.105).aspx Плюс я бы добавил индекс. Тем более, что пока особенно народ не жалуется. |
|
|
|
|
#16 |
|
Moderator
|
Цитата:
Сообщение от Alexius
Сурово
Тогда уж лучше, мне кажется, продублировать складские аналитики в InventSum и играться на ней с индексами под различные наборы. Тем более в АХ 2012 можно добавлять Include-поля и творить покрывающие индексы не утыкаясь в ограничение в 16 полей. Вроде допиливать придется не так и много.Кстати - как топикстартер верно заметил - это точно не его случай. У него там что-то другое происходит. |
|
|
|
|
#17 |
|
Участник
|
Если запросы тормозит не всегда, а после какого-то времени или время от времени, то можно поэкспериментировать с процедурным кэшем. Для начала попробовать его сбросить DBCC FREEPROCCACHE.
Еще на БД есть свойство PARAMETERIZATION, если его установить в FORCED, то сервер не будет кэшировать планы для каждого набора параметров запросов. Ну и на закуску возможно неплохо бы отключить параллелизм на сервере, если в MS SQL 2012 я пока не встречал "паразитных" распараллеливаний запросов, то на более древних версиях они могли укладывать не самые хилые дисковые подсистемы. |
|
|
|
|
#18 |
|
Участник
|
Цитата:
![]() из текста кстати непонтяно что за запрос - какие поля выбираются, еще из универсальных советов можно попробовать почистить InventSum от нулевых значений(closed=1) вообще перед тем как что-то оптимизировать лучше сперва понять цель запроса и кол-во выбираемых данных. может оказаться что надо не индексы делать, а настройки групп моделей менять Последний раз редактировалось trud; 16.11.2016 в 18:45. |
|
|
|
|
#19 |
|
Moderator
|
Цитата:
Ну и да - согласен, в исходном вопросе не хватает данных. Не понятно что за запрос и с какой целью идет. В идеале, надо было бы его выловить в кэше запросов на SQL Server и выложить сюда план. Странно что запрос так медленно работает при таких скромных объемах. |
|
|
|
|
#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 |
|
|
|
|
|