27.02.2023, 10:19 | #1 |
Участник
|
Пакетная инфраструктура дискриминирует пользователей: запускает задачи тех, у кого логины по лексической сортировке идут раньше
Недавно сотрудники службы поддержки обратились с проблемой: различными пользователями создано большое количество пакетных заданий (условно разноска журнала) в одной пакетной группе, при этом отчего-то задачи, созданные хронологически раньше, висят в статусе "Готово" по несколько часов, в то время как созданные хронологически позднее уже давно обработались. Дело оказалось в особенности работы BatchRun::serverGetOneTask() и индекса Batch.StatusUser, который используется в запросе выбора очередной пакетной задачи в статусе "Готово" для запуска (и перевода в статус "Выполнение"). Вот как выглядит план соответствующего запроса:
Индекс в стандарте имеет следующий состав: При прочих равных для определенной пакетной группы (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). |