AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.11.2010, 16:40   #1  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Непонятное подвисание queryRun.next()
Всем, привет!
Возможно вопрос и глупый, но я не понимаю, что происходит, в какую сторону рыть и что почитать, чтобы разобраться.

Ax4.0
Kernel: 4.0.2503.1176
App : 4.0.2501.122

В методе run вызываю 4 раза подряд разные queryRun. Что-то вроде такого.

queryRunTrans1 = new QueryRun(queryTrans1);
queryRunTrans2 = new QueryRun(queryTrans2);
queryRunTrans3 = new QueryRun(queryTrans3);
queryRunTrans4 = new QueryRun(queryTrans4);

Потом делаю что вот такое:

while(queryRunTrans1.next())
{
}

while(queryRunTrans2.next())
{
}

while(queryRunTrans3.next())
{
}

while(queryRunTrans4.next())
{
}

Прежде чем ппровалиться в третий queryRun идёт очень сильное зависание.
Если смотреть ко-во обрабатываемых строк, то да. Третий queryRun сильно отличается от всех остальных. 120000 строк примерно, в остальных по 5-6 тыс. Дело только в кол-ве строк или можно ещё что-то нарыть?

Спасибо!
Старый 13.11.2010, 16:49   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
судя по всему неоптимальный запрос построен для третьего queryRun, поэтому он долго считывает данные из БД.

P.S. смотрите план исполнения запроса, и оптимизируйте его (запрос).
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 13.11.2010 в 16:51. Причина: добавил З.Ы.
Старый 13.11.2010, 16:57   #3  
GBH is offline
GBH
MCITP
Аватар для GBH
MCP
MCBMSS
Ex AND Project
 
140 / 28 (1) +++
Регистрация: 28.06.2007
Цитата:
Сообщение от lev Посмотреть сообщение
судя по всему неоптимальный запрос построен для третьего queryRun, поэтому он долго считывает данные из БД.

P.S. смотрите план исполнения запроса, и оптимизируйте его (запрос).
Спасибо за ответ!
То что оптимизировать надо это , в принципе, было сразу понятно.
Но я думал ,вдруг, есть какие нибудь хитрые вещи.

Ещё раз спасибо.
Старый 13.11.2010, 17:18   #4  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Могу посоветовать создать серверный метод в классе (в самом классе поставить свойтво RunOn = "Server") и протестировать быстродействие, оставив только нужный цикл. А вообще согласен с участником lev - что-то не то в самом запросе.

Может быть, помимо большого количество записей в используемой таблице также слишком много полей, поэтому попробуйте включить в ваш запрос лишь необходимые поля (addSelectionField(...)), ну и, опять-таки, при необходимости добавить необходимые фильтры (addRange(...))
__________________
С уважением, Александр.
Старый 13.11.2010, 19:19   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если Вы качаете на клиента 120 тысяч строк, то это тоже причина тормоза. Можно для начала замерить время выполнения собственно запросов, убрав циклы

X++:
int timeStart;

queryRunTrans1 = new QueryRun(queryTrans1);
queryRunTrans2 = new QueryRun(queryTrans2);
queryRunTrans3 = new QueryRun(queryTrans3);
queryRunTrans4 = new QueryRun(queryTrans4);

timeStart = timeNow();
queryRunTrans1.next();
info(time2str(timeNow()-timeStart,1,1));

timeStart = timeNow();
queryRunTrans2.next();
info(time2str(timeNow()-timeStart,1,1));

timeStart = timeNow();
queryRunTrans3.next();
info(time2str(timeNow()-timeStart,1,1));

timeStart = timeNow();
queryRunTrans4.next();
info(time2str(timeNow()-timeStart,1,1));
Подобная проверка покажет насколько сильно отличается собственно выполнение запроса, поскольку фактически нет процесса закачки на клиента записей.

Если разница окажется не существенной, то проблема именно в объеме перекачиваемой информации. Надо либо уменьшать количество записей, либо уменьшать количество отбираемых полей в каждой записи, либо и то и друге.
Старый 13.11.2010, 22:11   #6  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Если Вы качаете на клиента 120 тысяч строк, то это тоже причина тормоза. Можно для начала замерить время выполнения собственно запросов, убрав циклы ...
из сообщения топикстартера видно, что тормозит до цикла...
Цитата:
Сообщение от GBH
Прежде чем ппровалиться в третий queryRun идёт очень сильное зависание
т.е. тормоза при выполнении queryRun.next(). значит все таки надо поработать над запросом
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 15.11.2010, 08:19   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от GBH Посмотреть сообщение
Прежде чем ппровалиться в третий queryRun идёт очень сильное зависание. Если смотреть ко-во обрабатываемых строк, то да. Третий queryRun сильно отличается от всех остальных. 120000 строк примерно, в остальных по 5-6 тыс. Дело только в кол-ве строк или можно ещё что-то нарыть?
Цитата:
Сообщение от lev Посмотреть сообщение
из сообщения топикстартера видно, что тормозит до цикла...
т.е. тормоза при выполнении queryRun.next(). значит все таки надо поработать над запросом
Согласен с lev, тормоза именно из-за запроса. Причём вероятно тормозит не обход 120 тысяч записей а выборка 120 тысяч записей. Проверьте, зависание заметно при выборе только первой записи (queryRun.next() тормозит только первый раз)?

Если так, то можно попробовать использовать хинт firstfast. Тогда SQL-сервер для возврата первой строки не будет дожидаться формирования полной выборки. Т.е. таким способом можно будет добиться некого распаралеливания. Пока будут отбираться остальные строки, вы уже начнёте обрабатывать вернувшуюся.
Старый 15.11.2010, 11:16   #8  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
firstfast
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если так, то можно попробовать использовать хинт firstfast. Тогда SQL-сервер для возврата первой строки не будет дожидаться формирования полной выборки. Т.е. таким способом можно будет добиться некого распаралеливания. Пока будут отбираться остальные строки, вы уже начнёте обрабатывать вернувшуюся.
При firstfast SQLсервер будет вынужден для получения данных использовать индексы исходя из сортировок, а не фильтров. Несколько раз подумать и все проверить прежде чем использовать.
За это сообщение автора поблагодарили: lev (3), S.Kuskov (2).
Теги
запрос (query), как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axStart: Please keep the AOT reports in Dynamics AX next release alive Blog bot DAX Blogs 0 09.06.2010 08:05
OZKA's DAX Journal: Join между временной и постоянной таблицей через QueryRun. Blog bot DAX Blogs 12 14.01.2009 17:34
axStart: Please keep the AOT reports in Dynamics AX next release alive Blog bot DAX Blogs 2 13.12.2008 12:18
Ошибка при выполнении queryRun.next() Poleax DAX: Программирование 6 23.07.2008 18:49
while (queryRun.next()) Tiruvileijadal' DAX: Программирование 6 06.12.2007 07:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:10.