我列出了属于小组(课堂)的学生所做的练习提交,其中包含:
submission table: userId, groupId, exercise_id (and more irrelevant data)
users table: userId, groupId
我想选择特定小组中所有学生完成的所有练习。为此,我目前有:
SELECT DISTINCT(exercise_id) FROM submissions as c1 WHERE c1.groupId = 1
AND NOT EXISTS(
SELECT DISTINCT(UserId) FROM users as u WHERE u.GroupId = 1
AND NOT EXISTS (
SELECT exercise_id FROM submissions as c2 WHERE u.UserId = c2.UserId
AND c2.exercise_id = c1.exercise_id
)
)
即。我选择了组中没有用户的所有练习。
但是,此查询在具有150万行的提交表上花费5秒。我可以采取哪些步骤来进一步优化此查询?我考虑过内部联接,但这不会导致相同的查询执行计划吗?
答案 0 :(得分:2)
groupid
真的不应该在两个表中。假设值一致,请尝试以下操作:
select s.exercise_id
from submissions s
where s.groupid = 1
group by s.exercise_id
having count(distinct userid) = (select count(distinct userid) from users where groupid = 1);
对于性能,您需要submissions(groupid, exercise_id)
上的索引。此外,如果您知道没有重复的提交或用户,请删除distinct
,因为这会对性能产生负面影响。