2017-08-31 52 views
1

我使用的是Postgres 9.6。我有两个表,storyslideslide有一个外键story最好在JOIN之前或之后提取字段?

有没有一个标准间在性能方面有什么区别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的输出,它看起来像两个具有完全相同的执行计划。

如果在性能方面没有差异,那么在风格上是否更好?

+0

版本1更好 - 风格化! – jarlh

+2

我不认为有性能差异。我更喜欢第一个版本。我只是建议避免使用SELECT *。而是使用列名称列表。 – etsa

回答

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,至少不是所有的时间) - 并增加了额外的开销。另外,子查询确实没有增加逻辑的可理解性。我是子查询的忠实粉丝,但不是不必要地使用它们。

相关问题