У меня есть SQL Server 2008 CTE, который отвечает за возврат Top Review для местоположения.
CTE обернут в UDF (Table-Valued) и объединен в поле LocationId , так что я могу получить лучший обзор для каждого местоположения.
Количество элементов :
1 Местоположение имеет 0-много PostLocations
1 PostLocation имеет 1 Post
1 Сообщение имеет 1 Отзыв
Вот UDF:
CREATE FUNCTION [dbo].[Review_HighestRated_Aggregated_ByLocation]
(
)
RETURNS TABLE
AS
RETURN
(
WITH [RankedLocations] AS
(
SELECT PL.LocationId,
R.Rating,
P.PostID,
P.UniqueUri,
P.Content,
ROW_NUMBER() OVER (PARTITION BY PL.LocationId ORDER BY R.Rating DESC, P.LocationTypeId, P.CreatedOn DESC) As ScoreRank
From dbo.PostLocations As PL
INNER JOIN dbo.Posts As P
ON P.PostId = PL.PostId
INNER JOIN dbo.Reviews As R
ON R.PostId = P.PostId
WHERE R.ReviewTypeId <> 5
AND P.Content IS NOT NULL
)
SELECT LocationId, Rating, PostID, UniqueUri, Content
FROM RankedLocations
WHERE ScoreRank = 1
)
Вот пример того, как я его использую:
select l.LocationId, l.Name, l.UniqueUri, r.UniqueUri, r.Content
from @Locations l -- temp table containing around 18 location ids
inner join dbo.Review_HighestRated_Aggregated_ByLocation() r
on l.LocationId = r.LocationId
Приведенный выше запрос занимает 15 секунд , что недопустимо. Без присоединения к UDF это займет 0 секунд.
Есть идеи, как мне его улучшить?
Если я посмотрю на план выполнения, это SORT , который берет 98% от стоимости выполнения. Стоимость операций ввода-вывода / поддерева для этой операции составляет ~ 300.
Я надеялся, что план выполнения даст мне подсказку для индекса, который я мог бы создать, чтобы повысить стоимость, но я ничего не получаю.
Есть идеи?