Показать сообщение отдельно
Старый 04.12.2007, 13:18   #13  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
Запрос:
X++:
while select inventTable where ...
{
}
Где "..." набор некоторых ограничений. В итоге цикл выполняется 66542 раза за 32 сек. Если в цикл добавить запрос на выборку запасов в наличии
X++:
select sum(AvailPhysical) from inventSum
join maxof(recid) from InventDim
where inventSum.InventDimId      == inventDim.inventDimId 
   && inventSum.ItemId           == inventTable.ItemId 
   && inventSum.Closed           == NoYes::No 
   && inventDim.InventLocationId == 'склад'
Запрос выполняется очень быстро. Разве что немного мешает maxof(recid), но без него на сервер уходит запрос всех полей из InventDim, что неверно.
а зачем использовать агрегатную функцию? просто join recId не дает нужного эффекта?
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
Так вот - такой цикл выполняется очень долго. Честно ждал полчаса, но безрезультатно.
Что-то я не пойму: цикл while selet inventTable выполняется быстро, запрос по InventSum выполняется быстро, а все вместе медленно? Попробуйте поставить условия where по InventSum перед join InventDim - на форуме писали, что Ms SQL может не самым эффектиным образом обрабатывать запрос по нескольким таблицам, где все where свалены в конец запроса. Посмотрите на план запроса, на то, какие индексы там используются. Попробуйте поменять условия where для InventSum, чтобы они соответствовали порядку полей хоть в одном из индексов на InventSum, - на перестановку полей при подборе индекса у СУБД тоже может уходить дополнительное время. Если ничего не поможет, попробуйте использовать forceplaceholders в запросе - возможно, на 66542 итераций его парсинга СУБД тратит больше времени, чем на саму выборку данных.
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
Вопрос что здесь не так, почему такое расхождение теории с практикой?
Трассировка SQL-запросов и профилировищик из СУБД гораздо точнее ответят вам на этот вопрос.