20.07.2012, 10:18 | #1 |
Участник
|
Зависание клиента при выполнении запроса
Здравствуйте Уважаемые.
Прошу Вашей помощи, т.к. свои идеи кончились. Два АОС-а, настроены идентично, данные так же одинаковы. Ax 4.0, ядро - 4.0.2503.756, приложение - 4.0.2501.347 SQL 2005. В качестве примера кода Job: X++: static void TestQuery(Args _args) { Query q = new Query(); QueryRun qr; QueryBuildDatasource qbdsInventTrans; QueryBuildDatasource qbdsSalesTable; ; qbdsSalesTable = q.addDataSource(tablenum(SalesTable)); qbdsSalesTable.addRange(fieldnum(SalesTable, ShippingDateConfirmed)).value(strfmt("(ShippingDateConfirmed <= %1)", date2strxpp(16\07\2011))); qbdsInventTrans = qbdsSalesTable.addDataSource(tablenum(InventTrans)); qbdsInventTrans.addLink(fieldnum(SalesTable, SalesId), fieldnum(InventTrans, TransRefId)); qbdsInventTrans.addRange(fieldnum(InventTrans, TransType)).value(SysQuery::value(InventTransType::Sales)); qbdsInventTrans.addRange(fieldnum(InventTrans, StatusIssue)).value(SysQuery::range(StatusIssue::ReservPhysical, StatusIssue::OnOrder)); qbdsInventTrans.joinMode(JoinMode::InnerJoin); qbdsInventTrans.fetchMode(QueryFetchMode::One2One); qr = new QueryRun(q); while(qr.next()) { info("Do something..."); } } Cессия остается в списке активных в аксапте. В SQL сессия находится в состоянии «Running». Ждал около часа результата. Безрезультатно. На другом АОС запрос выполняется сразу. Глобальная перекомпиляция, переиндексация, очистка кэша не помогла. Подскажите в каком направлении копать. Буду весьма признателен за любую помощь. Последний раз редактировалось Deepoint; 20.07.2012 в 10:33. |
|
20.07.2012, 10:30 | #2 |
Участник
|
|
|
20.07.2012, 10:32 | #3 |
Участник
|
Да, прошу прощения, это я дописал уже здесь, вместо исполняемого кода ради экономии места. Сейчас исправлю.
|
|
20.07.2012, 11:13 | #4 |
Участник
|
Данные идентичные, но базы разные? Смотрите план запроса, обновите статистику в SQL
|
|
20.07.2012, 12:32 | #5 |
Участник
|
а AOS передернуть принудительно? и попробовать заново?
|
|
21.07.2012, 09:07 | #6 |
Участник
|
Посмотрите ваш квэри (q) через SysQueryViewer::.... как там сложится запрос?
Спрашиваю это еще и потому что лично мне как то непривычно связывать SalesTable и InventTrans, я бы вязал проводки со строками заказа SaleLine. И еще одна вещь, зачем qbdsInventTrans.fetchMode(QueryFetchMode::One2One); ? это точно надо? |
|
22.07.2012, 13:14 | #7 |
Участник
|
Статистику SQL обновил.
Планы запросов одинаковы. Причем, что странно, на том АОС-е что зависает трассировка срабатывает через раз. Когда сформируется запись когда нет. Рестарт АОСов и перезагрузка сервера проводились. Проблема осталась... |
|
22.07.2012, 13:22 | #8 |
Участник
|
Код, к сожалению, не мой. Но суть вопроса - почему на одном АОСе работает на другом нет.
SysQueryViewer у меня нет, использую QueryBrowser. Зависает. |
|
22.07.2012, 14:00 | #9 |
Участник
|
Используйте квэри- вивер или браузер или вообще info(qbds.tostring()) перед строкой qr = new QueryRun(q); а эту строку и while закоментируйте вообще.
PS: И всё таки конструкция запроса мне не нравится, я бы переписал с использованием SalesLine |
|
22.07.2012, 15:13 | #10 |
Участник
|
Цитата:
ответьте на этот вопрос, пожалуйста. базы разные? если к каждой базе вручную задать аналогичные запросы в Management Studio, то время выполнения будет одинаковым? если одинаковым, то ройте в настройки, указанные в конфигурационной утилите для АОСов если разным (скорее всего), то ройте в сторону индексов. они скорее всего разные на разных базах. на одной из баз происходит полное сканирование вместо индексной выборки. поэтому и тормозит дело в том, что qr.next() выполняет отправку текста запроса на SQL-сервер. qr.next() ожидает ответа от SQL-сервера. если висит в этом месте, то нет ответа от SQL-сервера. АОС тут не при чем. |
|
22.07.2012, 15:27 | #11 |
Участник
|
Да, базы разные. Восстанавливались из одного бэкапа.
|
|
|
За это сообщение автора поблагодарили: gl00mie (0). |
22.07.2012, 19:28 | #12 |
Роман Долгополов (RDOL)
|
Почему по разному? Ответ "потомучто". Вам уже советовали - смотрите планы запросов. Всё остальное гадание.
Вероятно на одном сервере план запроса получился "хороший", на другом "плохой". Планы остаются в памяти для повторного использования. Можете выдать обоим серверам DBCC FREEPROCCACHE чтобы он забыли все сохраненные планы и начали с чистого листа. Из области простых гаданий - в стандарте на InventTrans нет индекса по TransType и TransRefId который в вашем запросе был бы очень кстати. Есть ли что то похожее в вашем приложении никто из нас не знает И опять же - смотрите планы и не гадайте - там всё написано и даже нарисовано. Чтобы оптмизаторы повели себя по разному даже в очень похожем окружении есть десятки причин. |
|
22.07.2012, 19:40 | #13 |
Участник
|
попробуйте таки выполнить запросы напрямую из Management Studio к двум базам.
разница по времени есть? а в планах выполнения? полное ощущение, что что-то в базах разное. несмотря на то, что восстановлено из бэкапа. либо восстановлено на медленные диски, либо восстановленое не равно исходной базе. но почему планы запросов одинаковы - непонятно. |
|
23.07.2012, 09:59 | #14 |
Участник
|
Кстааати.. AOS-s разные - вы сравните kernel version обоих аосов, такое подозрение, что на втором не установлены SP и Ru просто
|
|
23.07.2012, 10:55 | #15 |
Участник
|
Проблему решили кардинально... Переустановкой ОС. Залил все то же самое - заработало. Понимаю, что из пушки по воробьям, но время дорого было. Всем спасибо за помощь.
|
|
23.07.2012, 10:56 | #16 |
Участник
|
Первым делом смотрел. Одинаковые.
|
|
Теги |
аос, запрос (query), зависание |
|
|