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也足够了。