首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免PostgreSQL中的嵌套循环

避免PostgreSQL中的嵌套循环
EN

Stack Overflow用户
提问于 2014-10-08 02:57:07
回答 1查看 5.6K关注 0票数 3

请参阅下面的查询

代码语言:javascript
复制
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将错误地嵌套循环连接没有直接关系的学生表和教师表。例如:

代码语言:javascript
复制
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

此查询将永远运行。但是,如果我用表替换子查询,它将运行得非常快。在不使用临时表存储重复数据删除结果的情况下,有没有办法避免这种情况下的嵌套循环?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2015-02-07 22:02:54

您正在让数据库执行许多不必要的工作来实现您的目标。与其做3个不同的SELECT DISTINCT子查询都连接在一起,不如尝试直接将基表彼此连接起来,让它只处理一次不同的部分。如果您的表在ID字段上有适当的索引,这应该会运行得相当快。

代码语言:javascript
复制
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
     ) a
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26243215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档