Извините, а Вы план чего показываете? Выполнения "чистого" запроса или курсора? Вам надо проверять план выполнения вот такой конструкции
Код:
declare @P1 nvarchar(3) = N'dat',
@P2 nvarchar(20) = N'123456',
@P3 int = 0,
@P4 nvarchar(3) = N'dat',
@P5 nvarchar(20) = N'12345',
@P6 nvarchar(20) = N'12345',
@P7 nvarchar(20) = N'12345',
@P8 nvarchar(20) = N'12345',
@P9 nvarchar(20) = N'12345'
DECLARE Test CURSOR FOR
SELECT SUM(A.POSTEDQTY),
SUM(A.POSTEDVALUE),
SUM(A.PHYSICALVALUE),
SUM(A.DEDUCTED),
SUM(A.RECEIVED),
SUM(A.RESERVPHYSICAL),
SUM(A.RESERVORDERED),
SUM(A.REGISTERED),
SUM(A.PICKED),
SUM(A.ONORDER),
SUM(A.ORDERED),
SUM(A.ARRIVED),
SUM(A.QUOTATIONRECEIPT),
SUM(A.QUOTATIONISSUE),
SUM(A.AVAILPHYSICAL),
SUM(A.AVAILORDERED),
SUM(A.PHYSICALINVENT)
FROM INVENTSUM A
WHERE
A.DATAAREAID=@P1 AND
A.ITEMID =@P2 AND
A.CLOSED=@P3 AND
EXISTS (SELECT 'x'
FROM INVENTDIM B
WHERE B.DATAAREAID=@P4 AND
B.INVENTDIMID=A.INVENTDIMID AND
B.INVENTSIZEID =@P5 AND
B.INVENTCOLORID =@P6 AND
B.INVENTLOCATIONID =@P7 AND
B.INVENTBATCHID =@P8 AND
B.INVENTGTDID_RU =@P9)
open test
fetch test -- Вот на этой команде план смотреть
close test
deallocate test
Обращаю внимание, что выполнять его не обязательно. Достаточно предварительный план посмотреть. Сразу будет ясно "узкое" место
Затем сравните план выполнения, если заменить Exists на Inner Join
Для целей сравнения запишите 2 запроса рядом в одном Query. Ну, т.е. как-то так
Код:
DECLARE Test CURSOR FOR
SELECT ... FROM InventSum Where Exists(...)
DECLARE Test2 CURSOR FOR
SELECT ... FROM InventSum INNER JOIN InventDim (...)
open test
open test2
fetch test -- Вот на этой команде план смотреть
fetch test2 -- Вот на этой команде план смотреть
PS: Все скобки в WHERE в данном случае можно удалить. Это построитель запроса Axapta их добавляет. Но, поскольку здесь везде объединение по AND, то скобки только мешают анализу
PPS: Напомню, что план выполнения запроса с Exists
существенно зависит от объема данных. Поэтому Вы можете получить разные планы выполнения на тестовых данных и на рабочих, если на тесте данных немного