gpt4 book ai didi

sql-server - MSSQL JOIN ON GROUP BY 太慢

转载 作者:搜寻专家 更新时间:2023-10-30 20:07:14 25 4
gpt4 key购买 nike

我在 MSSQL 中有以下查询

SELECT TOP 50 CustomerID FROM Ratings
WHERE CustomerID != 915
AND MovieID IN (SELECT DISTINCT MovieID FROM Ratings WHERE CustomerID = 915)
GROUP BY CustomerID
ORDER BY count(*) DESC

速度超快。当我尝试在这样的子查询中使用它时。

SELECT * FROM Ratings
WHERE MovieID = 1 AND
CustomerID IN (SELECT TOP 50 CustomerID FROM Ratings
WHERE CustomerID != 915
AND MovieID IN (SELECT DISTINCT MovieID FROM Ratings WHERE CustomerID = 915)
GROUP BY CustomerID
ORDER BY count(*) DESC)

关于为什么这么慢以及如何加快它的任何想法?我的主键是 (MovieID-CustomerID),我在 CustomerID 上添加了一个索引

最佳答案

您需要在 (CustomerID, MovieID) 上创建一个额外的 UNIQUE 索引(按此顺序)以改进此查询。

有关性能详细信息,请参阅我的博客中的文章:

由于您的子查询返回 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

要从对 Movie 1 进行评分的客户中选择 TOP 50 客户,请使用:

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

关于sql-server - MSSQL JOIN ON GROUP BY 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/778237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com