04.08.2009, 09:53 | #1 |
Участник
|
Тормоза при получении очередной строки из ResultSet
Добрый день! Столкнулась с проблемой: при получении результата SQL-запроса через ResultSet (через подключение UserConnection) получение очередной строки данных (ResultSet.next()) занимает время, сопоставимое с выполнением всего запроса. В SQL Server Managment Studio запрос выполняется меньше секунды. Получении данных в Аксапте - около 900 строк - 20 (!) минут.
Причем данная ситуация возникает не для всех запросов. Данные другого запроса, имеющего сходную структуру, получаются мгновенно. Если кто-нибудь сталкивался с данной ситуацией, поделитесь своим опытом или соображениями. Спасибо. Ax3.0 sp3 |
|
04.08.2009, 10:30 | #2 |
Участник
|
А под чем у вас база крутится?
|
|
04.08.2009, 10:31 | #3 |
Участник
|
SQL Server
|
|
04.08.2009, 10:39 | #4 |
Участник
|
Если вам не тяжело, выложите пожалуйста сюда 2-а запроса - тот который тормозит и тот, который нормально работает.
|
|
04.08.2009, 10:52 | #5 |
Участник
|
оба запроса используют некоторые таблицы, которых нет на sys слое. Но могу выложить их sql-текст.
Первый запрос, получение очередной строки из которого происходит мгновенно: Код: select itm.itemId from inventTableModule itm(nolock) join (select availPhysical = sum(availPhysical), itemId from InventSum (nolock) where availPhysical > 0 and closed = 0 and dataareaId = 'dat' group by itemId )as t on t.itemId = itm.itemId join inventTable it (nolock) on it.ItemId = itm.itemId where itm.Blocked = 1 and itm.ModuleType = 2 and itm.dataareaId = 'dat' and it.dataareaId = 'dat' and it.itemType = 0 and it.itemRangeIdRef not in ( select RangeIdRef from inventItemRangeRef ref (nolock) where ref.RangeIdRefParent in (229837,228003,228265,225907) and ref.dataareaId = 'dat') Код: select itm.itemId from inventTable it (nolock) join inventTableModule itm(nolock) on itm.ItemId = it.ItemId and moduleType = 1 where itm.Blocked = 0 and itm.dataareaId = 'dat' and it.dataareaid = 'dat' and it.itemType = 0 and it.itemRangeIdRef not in ( select RangeIdRef from inventItemRangeRef ref (nolock) where ref.RangeIdRefParent in (229837,228003,228265,225907) and ref.dataareaId = 'dat') and it.ItemId not in (select distinct itemId from vendContractItem (nolock) where dataareaId = 'dat') |
|
04.08.2009, 12:07 | #6 |
MCITP
|
Retail?
А если сделть подобный запрос не через UserConnection, а из основного соединения то такого же не будет, да? Нет возможности избавиться от него (от UserConnection-а)?
__________________
Zhirenkov Vitaly |
|
04.08.2009, 12:12 | #7 |
Участник
|
Для Connection та же ситуация
|
|
04.08.2009, 12:20 | #8 |
MCITP
|
Тогда включите в Аксапте SQL-Trace и посмотрите план запроса, который на нём получается в Аксапте...
Сравните его с планом, который получается при выполнении напрямую (из Managment Studio) - есть отличия?
__________________
Zhirenkov Vitaly |
|
04.08.2009, 12:34 | #9 |
Участник
|
Нет, отличий в планах исполнения нет.
Такое ощущение, что каждый раз при ResultSet.next() запрос выполняется заново (судя по времени выполнения) |
|
04.08.2009, 12:42 | #10 |
MCITP
|
Цитата:
Если запрос выполняется заново, то с SQL-Trace вы увидите все запросы (~900 раз)... Если же он останется один - значит долго идёт именно fetch данных... Чем в этом случае помочь, даже не знаю... попробуйте пошаманить, переписать запрос, разбить на 2 и т.п... Что-то должно помочь.
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Alenka (1). |
04.08.2009, 12:42 | #11 |
Участник
|
А не задваивает он данные?
|
|
04.08.2009, 12:44 | #12 |
Участник
|
+1 к пересмотреть запрос. Попробуйте пойти от простого к сложному и посмотрите после джойна какой таблицы начинаются тормоза.
|
|
04.08.2009, 12:50 | #13 |
Участник
|
Нет, не задваивает.
Цитата:
Если же он останется один - значит долго идёт именно fetch данных...
Цитата:
Попробуйте пойти от простого к сложному и посмотрите после джойна какой таблицы начинаются тормоза.
|
|
04.08.2009, 12:54 | #14 |
MCITP
|
Ну проверьте таки на всякий случай, чтоб окончательно убедиться...
Как бороться - смотри выше... Цитата:
Не обязательно что-то выкидывать - можно попробовать поменять местами для начала, или наоборот что-то добавить. Если не поможет - разбейте на 2 запроса, например. Пробуйте, пока не достигните приемлимого результата по скорости.
__________________
Zhirenkov Vitaly |
|
04.08.2009, 13:31 | #15 |
Участник
|
Танцы с бубном вокруг запроса помогли! Tормозов при ResultSet.next() больше не стало. Правда запрос подурнел и ему определенно поплохело (в Студии стал выполняться дольше), но в общем - то же кол-во строк Аксапта стала получать за несколько секунд, вместо 20(!) минут.
Запрос стал выглядеть так: Код: select it.itemId from inventTable it (nolock) join inventTableModule itm(nolock) on itm.ItemId = it.ItemId and moduleType = 1 join ( select it.ItemId from inventTable it (nolock) left join ( select distinct itemId from vendContractItem (nolock) where dataareaId = 'dat' ) as v on v.ItemId = it.ITEMID where v.ItemId is null ) as vend on vend.ItemId = it.ItemId where itm.Blocked = 0 and itm.dataareaId = 'dat' and it.dataareaid = 'dat' and it.itemType = 0 and it.itemRangeIdRef not in ( select RangeIdRef from inventItemRangeRef ref (nolock) where ref.RangeIdRefParent in (229837,228003,228265,225907) and ref.dataareaId = 'dat') |
|
Теги |
ax3.0, resultset, sql |
|
Похожие темы | ||||
Тема | Ответов | |||
Цветные строки в Grid | 14 | |||
Проблема с ResultSet | 3 | |||
перевод строки в radiobutton | 2 | |||
При создании строки в закупке статус строки становится "Отменено" | 4 | |||
Функция "Удалить строки" | 1 |
|