CustTableListPage фильтрация слишком медленная
Когда я пытаюсь отфильтровать поле CustAccount в CustTableListPage, оно занимает слишком много времени для фильтрации. На остальных полях задержки нет. Я пытаюсь отфильтровать только часть номера счета, например "*123". Я сделал переиндексацию для custtable и также обновил статику, но не заметная разница вообще. Когда я добавил запрос на странице списка в виде, он фильтрует поле custAccount, как и другие поля. Любое предложение? Редактировать: Наша версия AX 2012 r2 cu8, не проблема для пользователя, которая возникает для каждого пользователя, класс Interaction имеет некоторые настройки, но только для установки некоторых кнопок включения / отключения реквизита. и т.д... я пытался посмотреть выполнение запроса, что я нашел не ясно. что-то вроде FETCH_API_CURSOR_000000..x
3 ответа
Я решил проблему. Запрос CustTableListPage имел сортировку по полю DirPartyTable.Name. Когда я удаляю эту сортировку, фильтрация с подстановочными знаками работает как шарм.
Имейте в виду, что подстановочные знаки (такие как *
) должны использоваться с осторожностью. Использование строки фильтра, начинающейся с подстановочного знака, снижает производительность, поскольку индексы SQL использовать нельзя.
Использование подстановочного знака в конце
Представьте, что у вас есть словарь, и вы должны перечислить все слова, начинающиеся с "Foo". Вы можете пропустить все записи перед "F", затем все до "Fo", затем все до "Foo" и начать список результатов оттуда.
Аналогичным образом, запрос базового механизма SQL на вывод списка всех записей CustAccount, начинающихся с "123" (= строка фильтра "123*"), позволяет использовать индекс CustAccount для быстрого перехода к соответствующим данным.
Использование подстановочного знака в начале
Представьте, что у вас все еще есть этот словарь, и вам нужно перечислить все слова, заканчивающиеся на 'ing'. У вас не будет другого выбора, кроме как пройти весь словарь и проверить окончание каждого слова (из-за алфавитной сортировки).
Это объясняет, почему запрос механизма SQL для перечисления всех записей CustAccount, заканчивающихся на "123" (= строка фильтра "*123"), означает, что все значения CustAccount должны быть исследованы. Таким образом, AOS перебирает все записи и использует курсор SQL для этого. Это оператор FETCH_API_CURSOR, который вы видите на уровне SQL.
Возможные решения
- Сообщите вашему конечному пользователю, что использование подстановочного знака в начале строки фильтра всегда будет медленным на большой таблице.
- Увеличьте аппаратные / выделенные ресурсы сервера SQL (более быстрый ЦП, больше ОЗУ, более быстрый диск, ...).
- Создайте полнотекстовый индекс на CustAccount (не фанат этого, и влияние на производительность должно быть тщательно исследовано).