14

例如,我有 3 个表:usergrouppermission,以及它们之间的两个 many2many 关系:user_groupsgroup_permissions

我需要选择给定用户的所有权限,不重复。每次遇到类似的问题,我都无法确定哪个版本的查询更好:

SELECT permisson_id FROM group_permission WHERE EXISTS(
    SELECT 1 FROM user_groups 
        WHERE user_groups.user_id = 42 
          AND user_groups.group_id = group_permission.group_id
)

SELECT DISTINCT permisson_id FROM group_permission
    INNER JOIN user_groups ON user_groups.user_id = 42 
           AND user_groups.group_id = group_permission.group_id 

我有足够的经验根据解释得出结论。第一个查询有子查询,但我的经验表明第一个查询更快。可能是因为结果中过滤了大量权限。

在这个情况下,你会怎么做?为什么?谢谢!

4

1 回答 1

17

使用 EXISTS 而不是 DISTINCT

您可以使用 DISTINCT 抑制重复行的显示;您使用 EXISTS 检查子查询返回的行是否存在。只要有可能,您应该使用 EXISTS 而不是 DISTINCT,因为 DISTINCT 在抑制重复行之前对检索到的行进行排序。

在你的情况下,应该有很多重复的数据,所以存在应该更快。

通过http://my.safaribooksonline.com/book/-/9780072229813/high-performance-sql-tuning/ch16lev1sec10

于 2012-08-30T17:07:27.327 回答