[英]Optimizing query to improve performance
如何优化以下SQL查询? 我有这个查询,但我需要对其进行优化,或者您对在线SQL重构工具有何建议?
表: Membership
+---------+--------+
| GroupID | UserID |
+---------+--------+
| 123 | 605 |
| 124 | 605 |
| 125 | 605 |
| 123 | 606 |
| 125 | 606 |
| 124 | 607 |
+---------+--------+
表: content_group_membership
+---------+-----------+
| GroupID | ContentId |
+---------+-----------+
| 11111 | 123 |
| 22222 | 123 |
| 44444 | 124 |
| 22222 | 125 |
| 11111 | 126 |
| 33333 | 126 |
| 11111 | 125 |
+---------+-----------+
Membership
表保存用户所属的groupID
列表, content_group_membership
表保存相应groupID
的允许ContentID
列表。
我们需要得到的名单contentID
这是该用户的限制, groupID
的UserID
应采取Membership
表和contentID
与groupID
的以外用户groupID
仅限ContentID
该UserID
。
下面是查询,现在我们正在使用的查询将以下查询用作子查询时所花费的时间是获取结果的三倍。 因此,我们希望优化查询能够快速获取结果。
预期结果:33333
查询:
SELECT DISTINCT
[ContentID], groupid
FROM
[content_group_membership]
WHERE
contentid NOT IN (SELECT [ContentID]
FROM [content_group_membership]
WHERE GroupID IN (SELECT groupid
FROM Membership
WHERE UserID = 605 ))
AND GroupID IN (SELECT GroupID
FROM [content_group_membership]
WHERE groupid NOT IN (SELECT groupid
FROM Membership
WHERE UserID = 605))
这应该等效,并且运行效率更高:
SELECT DISTINCT [ContentID],
groupid
FROM [content_group_membership]
WHERE contentid != ANY (SELECT [ContentID]
FROM [content_group_membership]
WHERE GroupID IN (SELECT groupid
FROM Membership
WHERE UserID = 605
AND Active = 1))
AND GroupID NOT IN (SELECT groupid
FROM Membership
WHERE UserID = 605
AND Active = 1))
但是,这种过程的查询可能更好。
我没有足够的声誉来发表评论,因此,它将作为答案。
我相信此查询是为CTE准备的,因此不必执行两次。
http://technet.microsoft.com/zh-cn/library/ms186243(v=SQL.105).aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.