Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 优化查询以提高性能_Sql_Sql Server - Fatal编程技术网

Sql 优化查询以提高性能

Sql 优化查询以提高性能,sql,sql-server,Sql,Sql Server,如何优化下面的SQL查询?我有这个查询,但我需要对它进行优化,或者您对在线SQL重构工具有什么建议 表:会员资格 +---------+--------+ | GroupID | UserID | +---------+--------+ | 123 | 605 | | 124 | 605 | | 125 | 605 | | 123 | 606 | | 125 | 606 | | 124 | 607 | +---

如何优化下面的SQL查询?我有这个查询,但我需要对它进行优化,或者您对在线SQL重构工具有什么建议

表:
会员资格

+---------+--------+
| 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的子查询也会重复。所以…需要一个最好的查询方式。。。