我想优化此查询
**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来查找分页和然后执行计数查询和结果查询
正如我们已经知道的那样GROUP BY一起使用会导致输出错误。
现在我想优化查询并且必须找到行数,即查询的计数。请更好地找出结果。
答案 0 :(得分: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