如果联接或子选择不依赖于行中的任何其他内容,那么Postgres是否足够聪明,不对每个结果行重新运行联接或子选择?
举例来说:
在Postgres中,我有两个表,account
和profile
。我想写一个查询,返回所有活跃用户的配置文件,只有当调用用户(其user_id
在变量$userId
中提供)也是活跃的时,才应该返回它们。在SQL中,这将是:
select * from profile
left outer join account as viewer_account on
viewer_account.user_id = $userId
left outer join account as profile_account on
profile_account.user_id = profile.user_id
where
viewer_account.account_status = 'active' and
profile_account.account_status = 'active'
字符串
我的问题是viewer_account
在每一行中都是相同的--它不依赖于profile
的结果(具体地说,它不像profile_account
那样依赖于profile.user_id
)。但是,第一次外部连接是对每一行执行(浪费工作),还是只执行一次,然后复制到结果集的每一行?
1条答案
按热度按时间r1wp621o1#
通常,PostgreSQL查询规划器足够智能,可以识别出在哪些情况下,查询的一部分可能只对整个结果集计算一次,而不依赖于正在处理的行。通过只计算一次初始连接的结果并重用它,它可能会适当地优化执行计划。检查EXPLAIN输出以获得规划器选择的特定执行计划。
字符串
希望对你有帮助:)