![]() |
#8 |
Участник
|
Цитата:
![]() Ну, вот последний по времени пример, когда опять напоролся на ту же проблему X++: while select ItemId, SalesQty, LineAmount, salesId from salesLine where salesLine.SalesQty != 0 exists join wmsBillOfLadingOrder // join TableId from wmsBillOfLadingOrder where wmsBillOfLadingOrder.inventTransRefId == salesLine.SalesId && wmsBillOfLadingOrder.billOfLadingId == "101" { info(salesLine.ItemId); } Как говорится, "почувствуйте разницу"! На два порядка! 2243 и 21. Если же посмотреть где именно тратятся ресурсы, то в случае с inner join небольшое время тратится на команде "exec sp_cursoropen". А вот в случае с exist открытие курсора происходит мгновенно, но бешенная задержка не первой команде "exec sp_cursorfetch" после открытия курсора Если же выдернуть оба запроса, которые прошли через профайлер, в Managment Studio, то время их исполнения практически одинаковое. План запросов делит их в процентном отношении ровно по 50% Хотя, согласен, что TSQL_SPs показал, что запрос никак не делится. Как был Exists, так и остался. Но, от этого ничуть не легче... Очевидно, что внутри "exec sp_cursoropen" его обработка выполняется как-то иначе, чем в Managment Studio. И опять же, от Axapta тут ничего не зависит! Да, для порядка, профайлер показал, что на сервер ушли такие запросы Код: SELECT A.ITEMID,A.SALESQTY,A.LINEAMOUNT,A.SALESID,A.RECID FROM SALESLINE A WHERE ((A.DATAAREAID='цтр') AND (A.SALESQTY<>0)) AND EXISTS (SELECT 'x' FROM WMSBILLOFLADINGORDER B WHERE ((B.DATAAREAID='цтр') AND ((B.INVENTTRANSREFID=A.SALESID) AND (B.BILLOFLADINGID='101')))) SELECT A.ITEMID,A.SALESQTY,A.LINEAMOUNT,A.SALESID,A.RECID FROM SALESLINE A,WMSBILLOFLADINGORDER B WHERE ((A.DATAAREAID='цтр') AND (A.SALESQTY<>0)) AND ((B.DATAAREAID='цтр') AND ((B.INVENTTRANSREFID=A.SALESID) AND (B.BILLOFLADINGID='101'))) |
|
|
За это сообщение автора поблагодарили: gl00mie (3). |