Sql 优化查询以提高性能
如何优化下面的SQL查询?我有这个查询,但我需要对它进行优化,或者您对在线SQL重构工具有什么建议 表:Sql 优化查询以提高性能,sql,sql-server,Sql,Sql Server,如何优化下面的SQL查询?我有这个查询,但我需要对它进行优化,或者您对在线SQL重构工具有什么建议 表:会员资格 +---------+--------+ | GroupID | UserID | +---------+--------+ | 123 | 605 | | 124 | 605 | | 125 | 605 | | 123 | 606 | | 125 | 606 | | 124 | 607 | +---
会员资格
+---------+--------+
| GroupID | UserID |
+---------+--------+
| 123 | 605 |
| 124 | 605 |
| 125 | 605 |
| 123 | 606 |
| 125 | 606 |
| 124 | 607 |
+---------+--------+
+---------+-----------+
| GroupID | ContentId |
+---------+-----------+
| 11111 | 123 |
| 22222 | 123 |
| 44444 | 124 |
| 22222 | 125 |
| 11111 | 126 |
| 33333 | 126 |
| 11111 | 125 |
+---------+-----------+
表:content\u group\u membership
+---------+--------+
| GroupID | UserID |
+---------+--------+
| 123 | 605 |
| 124 | 605 |
| 125 | 605 |
| 123 | 606 |
| 125 | 606 |
| 124 | 607 |
+---------+--------+
+---------+-----------+
| GroupID | ContentId |
+---------+-----------+
| 11111 | 123 |
| 22222 | 123 |
| 44444 | 124 |
| 22222 | 125 |
| 11111 | 126 |
| 33333 | 126 |
| 11111 | 125 |
+---------+-----------+
Membership
表保存用户所属的groupID
列表,而content\u group\u Membership
表保存相应groupID
的允许ContentID
列表
我们需要获取限制该用户使用的contentID
列表,groupID
的UserID
应从Membership
表中获取,而UserID
以外的groupID
的contentID
受限制
下面是我们正在使用的查询,当下面的查询用作子查询时,它将花费三倍的时间来获取结果。因此,我们需要一个优化的查询来快速获取结果
预期结果: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))
然而,这种复杂的查询作为一个过程可能更好 请编辑您的问题以澄清您的需求。样本数据和期望的结果是有用的。与数据结构匹配的查询很重要。例如,什么是
Active=1
?它有什么慢的地方?您是否运行过(SSMS)SQL Server Management Studio执行计划?要执行后者,请打开SSMS,将代码粘贴到查询窗口中,然后按Ctrl+L。然后,查看结果并发布。如果不是SSMS,您将使用什么工具来构建和执行SQL?@Linoff,Active=1表示用户应该是活动用户。我已经删除了它,因为我没有在示例表中使用它。我也更新了我的问题。如果你需要更多信息,请告诉我。我认为多个子查询会降低性能,而且获取用户组id的子查询也会重复。所以…需要一个最好的查询方式。。。