Вам нужно будет создать дополнительный индекс UNIQUE
для (CustomerID, MovieID)
(в этом порядке), чтобы улучшить этот запрос.
Подробнее о производительности смотрите в статье в моем блоге:
Поскольку ваши подзапросы возвращают UNIQUE
наборов значений, запрос может быть переписан как JOIN
:
SELECT r2.*
FROM (
SELECT TOP 50 CustomerID
FROM (
SELECT MovieID
FROM Ratings
WHERE CustomerID = 915
) q
JOIN Ratings r
ON r.MovieID = q.MovieID
AND CustomerID <> 915
GROUP BY
CustomerID
ORDER BY
COUNT(*) DESC
) ro
JOIN Ratings r2
ON r2.MovieID = 1
AND r2.CustomerID = ro.CustomerID
Чтобы выбрать TOP 50
клиентов из числа тех, кто оценил Movie 1
, используйте:
SELECT r2.*
FROM (
SELECT TOP 50 CustomerID
FROM (
SELECT MovieID
FROM Ratings
WHERE CustomerID = 915
) q
JOIN Ratings r
ON r.MovieID = q.MovieID
AND CustomerID <> 915
AND EXISTS
(
SELECT 1
FROM Ratings re
WHERE re.MovieID = 1
AND re.CustomerID = r.CustomerID
)
GROUP BY
CustomerID
ORDER BY
COUNT(*) DESC
) ro
JOIN Ratings r2
ON r2.MovieID = 1
AND r2.CustomerID = ro.CustomerID