Из плана Query, который вы опубликовали, похоже, он обращается к 10 таблицам
Статья, Клиент, Контракт, Товары, ТоварыАртикул, Товары, Событие, Сайт, SiteIn, StockType, StockTypeContract
Все ли это на самом деле требуется для ваших результатов, или это просто артефакты того, к чему вы присоединяетесь?
В плане есть 10 корневых узлов для этих 10 таблиц, поэтому определенно к некоторым таблицам обращаются более одного раза, и это выглядит довольно расточительным образом.
Вы можете видеть в этой части плана (добавляется до 40% от стоимости) Похоже, что GoodsEvent доступен три раза. Я почти уверен, что если вы избавитесь от мнений, вы сможете закрепить это.
Часть плана http://img245.imageshack.us/img245/4105/executionplan.png
Я думаю, что в данный момент этот кусок плана делает что-то вроде этого
SELECT Query3.Gid, Query3.SiteId, Query3.Lid, Query3.Expr1017
FROM
(
SELECT
Gid,
SUM(CASE WHEN Type ='SO' THEN -Quantity ELSE Quantity END) AS Expr1017
FROM GoodsEvent
WHERE Type IN('AQ','SI','SO') AND IsDeleted = 0
GROUP BY Gid
) Query1
JOIN
(
SELECT
Gid,
MAX(EventOn) AS Expr1014
FROM GoodsEvent
WHERE IsDeleted = 0
GROUP BY Gid
) Query2 ON Query1.GID = Query2.GID
JOIN
(
SELECT
GoodsEvent.Gid,
GoodsEvent.EventOn,
GoodsEvent.SiteId,
GoodsEvent.Lid
FROM GoodsEvent WHERE IsDeleted = 0
) Query3 ON Query3.gid=Query2.gid AND Query3.EventOn = Query2.Expr1014
Возможно, стоит проверить, является ли это семантически эквивалентным и лучше ли работает
;WITH X AS
(
SELECT Gid,
SiteId,
Lid,
RANK() OVER (PARTITION BY Gid ORDER BY EventOn DESC) AS RN,
Type
FROM GoodsEvent
WHERE IsDeleted = 0
)
SELECT Gid,SiteId, Lid,
SUM(CASE WHEN Type ='SO' THEN -Quantity ELSE Quantity END)
OVER(PARTITION BY Gid) AS Expr1017,
FROM X WHERE RN=1 AND Type IN('AQ','SI','SO')