是否优先在JOIN之前或之后提取字段?

时间:2017-08-31 07:33:54

标签: sql postgresql

我使用的是Postgres 9.6。我有两个表storyslideslide有一个story的外键。

标准JOIN查询之间的性能术语是否存在差异:

SELECT story.*, slide.name, slide.story_id 
FROM story 
JOIN slide ON story.id=slide.story_id 
WHERE slide.index=0;

这样的子查询,首先提取感兴趣的字段,然后才加入它们:

SELECT story.*, slide.name, slide.story_id 
FROM story 
JOIN (SELECT * FROM slide WHERE index=0) slide 
ON story.id=slide.story_id;

我一直在查看EXECUTION ANALYSE的输出,看起来两者的执行计划完全相同。

如果性能方面没有差异,那么风格上是另一种优势吗?

1 个答案:

答案 0 :(得分:1)

第一个最好是风格上的。 。以防万一。我会用表别名写它:

SELECT st.*, sl.name,
       sl.story_id   -- unnecessary
FROM story st JOIN
     slide sl
     ON st.id = sl.story_id 
WHERE sl.index = 0;

而且,你为什么选择sl.story_id?它只是重复st.id

"以防万一"是因为一些数据库实现了子查询(而不是Postgres,至少不是所有时间) - 这增加了额外的开销。此外,子查询实际上没有增加任何使逻辑更容易理解的东西。我是子查询的忠实粉丝,但不是不必要地使用它们。