我使用的是Postgres 9.6。我有两个表story
和slide
:slide
有一个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
的输出,看起来两者的执行计划完全相同。
如果性能方面没有差异,那么风格上是另一种优势吗?
答案 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,至少不是所有时间) - 这增加了额外的开销。此外,子查询实际上没有增加任何使逻辑更容易理解的东西。我是子查询的忠实粉丝,但不是不必要地使用它们。