|  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 | |||
| 
 |