Postgres JOIN 条件与 WHERE 条件

Dan*_*Dan 13 postgresql join optimization

Postgres 新手在这里。

我想知道这个查询是否经过优化?我试图仅加入 100% 必要的值,并将所有动态条件留在 WHERE 子句中。见下文。

SELECT *
    FROM
      myapp_employees
    JOIN myapp_users ON
      myapp_users.user_id=myapp_employees.user_id
    JOIN myapp_contacts_assoc ON
      myapp_contacts_assoc.user_id=myapp_users.user_id
    JOIN myapp_contacts ON
      myapp_contacts.contact_id=myapp_contacts_assoc.contact_id
    WHERE
      myapp_contacts.value='test@gmail.com' AND
      myapp_contacts.type=(1)::INT2 AND
      myapp_contacts.is_primary=(1)::INT2 AND
      myapp_contacts.expired_at IS NULL AND
      myapp_employees.status=(1)::INT2 AND
      myapp_users.status=(1)::INT2
    LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

注意:对于上下文,此过程正在检查用户是否也是员工(提升的权限/不同的用户类型)。

无论如何,这是正确的方法吗?例如,JOIN ON 是否应该包含更多语句,例如检查 expired_at IS NULL?为什么或为什么这没有意义?

Erw*_*ter 18

从逻辑上讲,将条件放在 an 的连接子句中INNER JOIN还是将条件放在WHERE相同的子句中没有任何区别SELECT。效果是一样的。

(不是这种情况OUTER JOIN!)

在使用默认设置进行操作时,它对查询计划或性能也没有影响。Postgres 可以自由地重新排列连接和JOIN&WHERE条件以寻求最佳查询计划 - 只要表的数量不大于join_collapse_limit(默认8)。细节:

为了可读性和可维护性,在各个JOIN子句中放置连接表的条件和在WHERE子句中的一般条件是有意义的。

您的查询看起来很好。不过,我会使用表别名来减少噪音。

小细节:

int2 '1'甚至1::int2比 更明智(1)::INT2。与定义明确的数字数据类型的值相比,普通数字常量1也足够了。