Почему выполнение запроса после обновления занимает в 100 раз больше времени?

У меня есть форма с 4 источниками данных. Он выполнен в стиле списка и имеет Datasource1 (большая таблица с множеством отношений, столбцов и индексов), показанную в сетке. Когда я открываю эту форму, для ее открытия требуется около 200 мс, но когда я обновляю ее, для обновления требуется 13 с.

Я использовал инструмент профилировщика кода и обнаружил, что время потребляется в источнике данных1 в методе executeQuery() с помощью команды super();

Когда executeQuery() вызывается из формы с помощью

Datasource1_ds.executeQuery();

для вызова требуется 200 мс.

В сетке формы около 15 столбцов, и сортировка по одному занимает чуть меньше 1 с.

Итак, мой вопрос. Что вызывается в super();, когда форма обновляется задачей F5 и не вызывается при открытии формы и вызове Datasource1_ds.executeQuery();?

Я пытаюсь использовать профилировщик кода с различными настройками и действиями, отлаживать код в различных действиях, использовать профилировщик Visual Studio, использовать монитор активности на сервере Microsoft SQL в базе данных Microsoft Dynamics AX, изменить таблицу Datasource1, но безуспешно.

Каждый раз, когда я оказываюсь на super(); единственный раз, когда обновление происходит быстро, это когда у меня есть фильтры в сетке, и она показывает меньше строк. (Я пытаюсь использовать свойство VisibleRows в сетке, но это не помогает.)

Я использую Microsoft Dynamics AX 2012 R2.


person boucekv    schedule 02.04.2015    source источник
comment
@MaximLazarev Да, но у меня проблема с методом task(#taskF5). F5 на форме и методе задачи не изменяется.   -  person boucekv    schedule 02.04.2015
comment
@FH-Inway Я просто использую Trace Parcer, чтобы найти проблемный запрос. Это хороший совет, чтобы посмотреть на запрос при открытии формы и сравнить его. Анализатор трассировки возвращает мне запрос с ? например (T1.RECID‹?) где ? обозначает реальную стоимость. Можно ли получить 1 запрос с реальными значениями, чтобы я мог проанализировать его в диспетчере SQL Server?   -  person boucekv    schedule 03.04.2015
comment
@boucekv: ключевое слово — литералы или принудительные литералы. Я не использовал это некоторое время, поэтому мне пришлось бы провести собственное исследование, но эти ссылки помогут вам начать работу: technet.microsoft.com/en-us/library/aa569637.aspx и ax.nom.es/dynamicsax/axapta-comman-line-parameters-2. Просто выполните поиск по ключевым словам на этих страницах.   -  person FH-Inway    schedule 03.04.2015
comment
Попробуйте добавить this.query().literals(true); после super() в методе init источника данных.   -  person Jan B. Kjeldsen    schedule 07.04.2015


Ответы (1)


Я бы предложил фиксировать с помощью SQL Server Profiler запросы, которые выполняются (1) при начальном executeQuery() при открытии формы ListPage, а затем (2) при вызове executeQuery() при обновлении формы.

Сравнение планов выполнения этих двух запросов должно выявить узкое место. Вы можете перехватить событие Showplan XML.

person kirv    schedule 04.04.2015
comment
Проблема в запросе, который вызывается. Они разные. У медленного в 15 раз больше, WHERE clausule. Теперь я пытаюсь найти, что изменить, чтобы изменить querz, который вызывается при обновлении формы. Сейчас безуспешно. - person boucekv; 09.04.2015