请参阅下面的查询
Select count(*) FROM
(Select distinct Student_ID, Name, Student_Age, CourseID from student) a1
JOIN
(Select distinct CourseID, CourseName, TeacherID from courses) a2
ON a1.CourseID=a2.CourseID
JOIN
(Select distinct TeacherID, TeacherName, Teacher_Age from teachers) a3
ON a2.TeacherID=a3.TeacherID子查询必须用于重复数据消除目的。
这个查询在PostgreSQL中运行得很好。但是,如果我在学生表和教师表之间添加一个条件,根据执行计划,Postgres将错误地嵌套循环连接没有直接关系的学生表和教师表。例如:
Select count(*) FROM
(Select distinct Student_ID, Name, Student_Age, CourseID from student) a1
JOIN
(Select distinct CourseID, CourseName, TeacherID from courses) a2
ON a1.CourseID=a2.CourseID
JOIN
(Select distinct TeacherID, TeacherName, Teacher_Age from teachers) a3 ON
a2.TeacherID=a3.TeacherID
WHERE Teacher_Age>=Student_Age此查询将永远运行。但是,如果我用表替换子查询,它将运行得非常快。在不使用临时表存储重复数据删除结果的情况下,有没有办法避免这种情况下的嵌套循环?
谢谢你的帮助。
发布于 2015-02-07 22:02:54
您正在让数据库执行许多不必要的工作来实现您的目标。与其做3个不同的SELECT DISTINCT子查询都连接在一起,不如尝试直接将基表彼此连接起来,让它只处理一次不同的部分。如果您的表在ID字段上有适当的索引,这应该会运行得相当快。
SELECT COUNT(1)
FROM (
SELECT DISTINCT s.Student_ID, c.CourseID, t.TeacherID
FROM student s
JOIN courses c ON s.CourseID = c.CourseID
JOIN teachers t ON c.TeacherID = t.TeacherID
WHERE t.Teacher_Age >= s.StudentAge
) ahttps://stackoverflow.com/questions/26243215
复制相似问题