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