13.11.2010, 16:40 | #1 |
MCITP
|
Непонятное подвисание 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 |
Ищущий знания...
|
судя по всему неоптимальный запрос построен для третьего queryRun, поэтому он долго считывает данные из БД.
P.S. смотрите план исполнения запроса, и оптимизируйте его (запрос).
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 13.11.2010 в 16:51. Причина: добавил З.Ы. |
|
13.11.2010, 16:57 | #3 |
MCITP
|
Цитата:
То что оптимизировать надо это , в принципе, было сразу понятно. Но я думал ,вдруг, есть какие нибудь хитрые вещи. Ещё раз спасибо. |
|
13.11.2010, 17:18 | #4 |
Участник
|
Могу посоветовать создать серверный метод в классе (в самом классе поставить свойтво RunOn = "Server") и протестировать быстродействие, оставив только нужный цикл. А вообще согласен с участником lev - что-то не то в самом запросе.
Может быть, помимо большого количество записей в используемой таблице также слишком много полей, поэтому попробуйте включить в ваш запрос лишь необходимые поля (addSelectionField(...)), ну и, опять-таки, при необходимости добавить необходимые фильтры (addRange(...))
__________________
С уважением, Александр. |
|
13.11.2010, 19:19 | #5 |
Участник
|
Если Вы качаете на клиента 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 |
Ищущий знания...
|
Цитата:
Цитата:
Сообщение от GBH
Прежде чем ппровалиться в третий queryRun идёт очень сильное зависание
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
15.11.2010, 08:19 | #7 |
Участник
|
Цитата:
Цитата:
Если так, то можно попробовать использовать хинт firstfast. Тогда SQL-сервер для возврата первой строки не будет дожидаться формирования полной выборки. Т.е. таким способом можно будет добиться некого распаралеливания. Пока будут отбираться остальные строки, вы уже начнёте обрабатывать вернувшуюся. |
|
15.11.2010, 11:16 | #8 |
----------------
|
firstfast
Цитата:
Сообщение от S.Kuskov
Если так, то можно попробовать использовать хинт firstfast. Тогда SQL-сервер для возврата первой строки не будет дожидаться формирования полной выборки. Т.е. таким способом можно будет добиться некого распаралеливания. Пока будут отбираться остальные строки, вы уже начнёте обрабатывать вернувшуюся.
|
|
|
За это сообщение автора поблагодарили: lev (3), S.Kuskov (2). |
Теги |
запрос (query), как правильно |
|
|