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