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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.02.2023, 10:19   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Cool Пакетная инфраструктура дискриминирует пользователей: запускает задачи тех, у кого логины по лексической сортировке идут раньше
Недавно сотрудники службы поддержки обратились с проблемой: различными пользователями создано большое количество пакетных заданий (условно разноска журнала) в одной пакетной группе, при этом отчего-то задачи, созданные хронологически раньше, висят в статусе "Готово" по несколько часов, в то время как созданные хронологически позднее уже давно обработались. Дело оказалось в особенности работы BatchRun::serverGetOneTask() и индекса Batch.StatusUser, который используется в запросе выбора очередной пакетной задачи в статусе "Готово" для запуска (и перевода в статус "Выполнение"). Вот как выглядит план соответствующего запроса:
Нажмите на изображение для увеличения
Название: BatchRun-query-plan.png
Просмотров: 65
Размер:	67.5 Кб
ID:	13550
Индекс в стандарте имеет следующий состав:
Название: Batch-index-StatusUser.png
Просмотров: 136

Размер: 30.4 Кб
При прочих равных для определенной пакетной группы (GroupId), статуса пакетной задачи (Status) и ее типа запуска (RunType) первыми всегда выбираются пакетные задачи, созданные пользователями, у которых идентификаторы пользователя (UserId) лексически идут раньше, даже если сами пакетные задачи хронологически были созданы позже. В стандарте еще есть сортировка по приоритету (Priority), но на практике пользователи этой возможностью обычно не пользуются.
Эту историческую несправедливость (более ранний запуск пакетных задач в зависимости от кода пользователя, а не хронологии создания задач) можно исправить, если перед UserId добавить в индекс поле CreatedDateTime. Во избежание того, что план запроса может "слететь", лучше, конечно, переписать запрос в коде BatchRun::serverGetOneTask() и там хинтами + сортировкой зафиксировать порядок обработки таблиц и использование индекса Batch.StatusUser.

Проверялось всё на AX2012 R3

Последний раз редактировалось gl00mie; 27.02.2023 в 10:24.
За это сообщение автора поблагодарили: raz (5), sukhanchik (10), Pandasama (3), Logger (5), Михаил Андреев (10), Capodastr (1), Manner (1), Товарищ ♂uatr (4), -DocSerzh- (1), d_alexe (1).
Теги
ax2012

 


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

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

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