1

我想优化这个查询

    **SELECT * FROM Users WHERE Active = 1 AND UserId IN (SELECT UserId FROM Users_Roles WHERE RoleId IN (SELECT RoleId FROM Roles WHERE PermissionLevel >= 100)) ORDER BY LastName**

当我用下面的连接替换上面的查询时,执行时间变少了,

     **SELECT  u.* FROM Users u INNER JOIN Users_Roles ur ON (u.UserId = ur.UserId) INNER JOIN Roles r ON  (r.RoleId = ur.RoleId) WHERE u.Active = 1  AND r.PermissionLevel > 100 GROUP BY u.UserId ORDER BY u.LastName**

但是上面的查询给出了重复的记录,因为我的角色表对每个用户都有多个条目。

我不能使用DISTINCT,因为有一个函数可以通过将 SELECT( * ) FROM 替换为 SELECT COUNT(*) FROM 来查找计数以查找分页计数,然后执行计数查询和结果查询

正如我们已经知道的那样,count & GROUP BY 一起使用会导致错误的输出。

现在我想优化查询并且必须找到行数,即查询的计数。请给出更好的方法找出结果。

4

1 回答 1

2

在不完全了解架构的情况下很难优化其他人的查询,索引什么没有,有多少数据,你的 DBMS 是什么等等。即使这样,我们也看不到执行计划、IO 统计信息等。记住这一点,下面的内容可能并不比你已经拥有的更好,但这是我在你的情况下编写查询的方式。

SELECT  u.* 
FROM    Users u
        INNER JOIN 
        (   SELECT  ur.UserID
            FROM    Users_Roles ur
                    INNER JOIN Roles r
                        ON r.RoleID = ur.RoleID
            WHERE   r.PermissionLevel > 100 
            GROUP BY ur.UserID
        ) ur
            ON u.UserId = ur.UserId
WHERE   u.Active = 1  
ORDER BY u.LastName
于 2012-07-20T09:45:26.140 回答