Фильтрация CustTableListPage слишком медленная

Когда я пытаюсь отфильтровать поле CustAccount на CustTableListPage, фильтрация занимает слишком много времени. На остальных полях задержки нет. Я пытаюсь отфильтровать только часть номера счета, например "*123". Я сделал переиндексацию для custtable, а также обновил статистику, но особой разницы не заметил. Когда я добавил запрос listpage в представление, он фильтрует поле custAccount, как и другие поля. Любое предложение? Изменить: наша версия - AX 2012 r2 cu8, а не проблема, связанная с пользователем, она возникает для каждого пользователя, класс взаимодействия имеет некоторые настройки, но только для настройки некоторых кнопок включения / отключения реквизита. и т.д... я попытался посмотреть выполнение запроса, что я нашел неясным. что-то вроде FETCH_API_CURSOR_000000..x


person afk    schedule 27.07.2016    source источник
comment
Вы проанализировали запрос SQL, например. просмотрев план выполнения запроса или используя анализатор трассировки? Какую версию Dynamics AX вы используете? Имеются ли настройки формы или класса взаимодействия? Если это происходит только для некоторых пользователей, это может помочь сбросить данные об использовании пользователя.   -  person FH-Inway    schedule 27.07.2016
comment
Наша версия — AX 2012 r2 cu8, это не проблема, связанная с пользователем, она возникает для каждого пользователя, класс взаимодействия имеет некоторые настройки, но только для установки некоторых кнопок, включающих / отключающих реквизит. и т.д... я попытался посмотреть выполнение запроса, что я нашел неясным. что-то вроде FETCH_API_CURSOR_000000..x   -  person afk    schedule 28.07.2016
comment
Не могли бы вы отредактировать эту информацию в своем вопросе? Также с планом выполнения запроса я имею в виду что-то вроде это. Может это также поможет в отношении FETCH_API_CURSOR.   -  person FH-Inway    schedule 28.07.2016
comment
Причина, по которой я не могу двигаться дальше, заключается в том, как найти sessionId, созданный AX для подключения sql.   -  person afk    schedule 28.07.2016


Ответы (3)


Запишите след этого выполнения и найдите узкое место.

person Anže Krpič    schedule 28.07.2016

Имейте в виду, что подстановочные знаки (такие как *) нужно использовать с осторожностью. Использование строки фильтра, начинающейся с подстановочного знака, снижает производительность, поскольку индексы SQL нельзя использовать.

Использование подстановочного знака в конце

Представьте, что у вас есть словарь и вам нужно перечислить все слова, начинающиеся с 'Foo'. Вы можете пропустить все записи до «F», затем все записи до «Fo», затем все записи до «Foo» и начать список результатов оттуда.

Аналогичным образом запрос базового механизма SQL на перечисление всех записей CustAccount, начиная с '123' (= строка фильтра '123*'), позволяет использовать индекс в CustAccount для быстрого перехода к нужным данным.

Использование подстановочного знака в начале

Представьте, что у вас все еще есть этот словарь, и вам нужно перечислить все слова, оканчивающиеся на "ing". У вас не было бы другого выбора, кроме как просмотреть весь словарь и проверить окончание каждого слова (из-за сортировки по алфавиту).

Это объясняет, почему запрос механизма SQL на перечисление всех записей CustAccount, оканчивающихся на '123' (= строка фильтра '*123'), означает, что необходимо изучить все значения CustAccount. Таким образом, AOS перебирает все записи и использует для этого курсор SQL. Это оператор FETCH_API_CURSOR, который вы видите на уровне SQL.

Возможные решения

  1. Объясните конечному пользователю, что использование подстановочного знака в начале строки фильтра всегда будет медленным на большой таблице.
  2. Улучшите аппаратное обеспечение/выделенные ресурсы SQL-сервера (более быстрый процессор, больше оперативной памяти, более быстрый диск и т. д.).
  3. Создайте полнотекстовый индекс на CustAccount (не в восторге от этого, и его влияние на производительность следует тщательно изучить).
person Sander    schedule 04.08.2016

Я решил проблему. Запрос CustTableListPage имел сортировку по полю DirPartyTable.Name. Когда я удаляю эту сортировку, фильтрация с подстановочными знаками работает как шарм.

person afk    schedule 10.08.2016