Показать сообщение отдельно
Старый 13.03.2017, 15:23   #22  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Извините, а Вы план чего показываете? Выполнения "чистого" запроса или курсора? Вам надо проверять план выполнения вот такой конструкции

Код:
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 существенно зависит от объема данных. Поэтому Вы можете получить разные планы выполнения на тестовых данных и на рабочих, если на тесте данных немного
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 13.03.2017 в 15:32.
За это сообщение автора поблагодарили: alex55 (1).