У меня есть следующий запрос, и он оказался очень дорогостоящим и занимает 6-8 секунд для выполнения. Рассматривая план выполнения, стоимость составляет 79% при операции SORT. Могу ли я получить какое-либо улучшение здесь?Головка бутылки на операции СОРТ
SELECT
A.StageName,
C.Month,
C.MonthName as Label,
C.Year,
isnull(A.Average,0) as Data
FROM
(
SELECT
S.StageName,
MONTH(TimeIn) as MonthNumber,
DATENAME(MONTH,TimeIn) as Month,
YEAR(TimeIn) as Year,
ISNULL(AVG(DATEDIFF(mi,TimeIn,isnull(TimeOut,@TodayDate))),0) as Average
FROM
VisitMovement VM
INNER JOIN Stage S on
VM.StageID = S.StageID
WHERE
(VM.TimeIn >= @StartDate AND
VM.TimeIn < DATEADD (d,1,@EndDate)) AND
(VM.TimeOut < DATEADD (d,1,@EndDate) OR VM.TimeOut IS NULL)
GROUP BY
S.StageNumber,
S.StageName,
MONTH(TimeIn),
DATENAME(MONTH,TimeIn),
YEAR(TimeIn)
) A
RIGHT JOIN (select distinct Month,MonthName,Year from Calendar WHERE DATE >= @StartDate AND DATE < DATEADD (d,1,@EndDate)) C on
A.MonthNumber = C.Month and
A.Month = C.MonthName and
A.Year = C.Year
GROUP BY
A.StageName,
C.Month,
C.MonthName,
C.Year,
A.Average
ORDER BY
CASE WHEN @Ordering = 'asc' THEN C.Year END ASC,
CASE WHEN @Ordering = 'asc' THEN C.Month END ASC,
CASE WHEN @Ordering = 'asc' THEN A.StageName END ASC,
CASE WHEN @Ordering = 'desc' THEN C.Year END DESC,
CASE WHEN @Ordering = 'desc' THEN C.Month END DESC,
CASE WHEN @Ordering = 'desc' THEN A.StageName END DESC
Самый дорогой вид в вашем плане происходит из-за итератора 'Stream Aggregate', поскольку этот итератор ожидает отсортированные входы, а итератор' Stream Aggregate' существует из-за вашего предложения 'inner group by'. Попытайтесь получить уникальные строки, не используя предложение 'Group by', которое потеряет« Сводную совокупность », и сортировка также исчезнет. –
Спасибо @ M.Ali - это невозможно, к сожалению, поскольку мне нужно сгруппировать все записи в таблице, чтобы рассчитать общее среднее значение. – Philip