在哪里和加入之间有什么区别?

时间:2017-05-22 19:40:54

标签: sql postgresql

我有两个相同的查询。首先,我使用Where

SELECT dings.id, doorbots.id
FROM dings
INNER JOIN doorbots ON dings.doorbot_id = doorbots.id
WHERE doorbots.id = 1615131 AND 
      deleted_at is NULL
ORDER BY dings.created_at;

第二,我将所有过滤器都放在join

SELECT dings.id, doorbots.id
FROM dings
INNER JOIN doorbots ON dings.doorbot_id = doorbots.id AND 
           doorbots.id = 1615131 AND 
           deleted_at is NULL
ORDER BY dings.created_at;

我有一个综合索引:doorbot_id_idx btree (doorbot_id) WHERE deleted_at IS NULL

这两个查询之间有任何性能差异吗? 什么是最好的方法?

2 个答案:

答案 0 :(得分:1)

对于INNER JOIN,替代方案是等效的,任何体面的SQL引擎都会以最有效的方式执行它。无论你怎么写它。

我个人更喜欢在ON子句中只添加ID比较,而进一步的过滤器会进入WHERE子句。

答案 1 :(得分:1)

如果不是相同的话,这两种方法很可能会提供更接近的表现。让查询规划器执行脏任务。 :)

问题是在SQL中保持良好的可读性,所以在这种情况下你必须:

  • 将过滤器表达式放在WHERE子句;
  • 只在JOIN加入表达式。也就是说,只有表之间的关系就在这里。