繁体   English   中英

优化查询以提高性能

[英]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这是该用户的限制, groupIDUserID应采取Membership表和contentIDgroupID的以外用户groupID仅限ContentIDUserID

下面是查询,现在我们正在使用的查询将以下查询用作子查询时所花费的时间是获取结果的三倍。 因此,我们希望优化查询能够快速获取结果。

预期结果: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM