13.03.2017, 15:06 | #21 |
Участник
|
Цитата:
принципиальный вопрос в том, можно ли DataAreaID ставить не на первое место в индексах? |
|
13.03.2017, 15:23 | #22 |
Участник
|
Извините, а Вы план чего показываете? Выполнения "чистого" запроса или курсора? Вам надо проверять план выполнения вот такой конструкции
Код: 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 -- Вот на этой команде план смотреть PPS: Напомню, что план выполнения запроса с Exists существенно зависит от объема данных. Поэтому Вы можете получить разные планы выполнения на тестовых данных и на рабочих, если на тесте данных немного
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 13.03.2017 в 15:32. |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
13.03.2017, 15:25 | #23 |
Участник
|
Конечно можно, и бывает ,что для каких-то таблиц так делают. Только, как уже было сказано, делать это не непосредственно в базе SQL, а в АОТ Аксапты, прямо указывая в индексе положение DataAreaId. Ну и, естественно, не везде подряд, а проверяя к чему это приводит с точки зрения выполнения запросов.
|
|
13.03.2017, 15:33 | #24 |
Модератор
|
Я правильно понимаю, что Index seek по InvendDim (напомню, серийники не используются) и уже потом JOIN с InventSum на всех планах исполнения никого не смущают?
__________________
-ТСЯ или -ТЬСЯ ? |
|
13.03.2017, 15:36 | #25 |
Участник
|
|
|
13.03.2017, 17:03 | #26 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Извините, а Вы план чего показываете? Выполнения "чистого" запроса или курсора? Вам надо проверять план выполнения вот такой конструкции
Код: 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 -- Вот на этой команде план смотреть PPS: Напомню, что план выполнения запроса с Exists существенно зависит от объема данных. Поэтому Вы можете получить разные планы выполнения на тестовых данных и на рабочих, если на тесте данных немного |
|
Теги |
axapta, dynamics ax, sql server, tuning |
|
|