04.12.2007, 13:18
|
#1
|
Участник
Регистрация: 28.11.2005
Адрес: Москва
|
Цитата:
Сообщение от 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-запросов и профилировищик из СУБД гораздо точнее ответят вам на этот вопрос.
|
|