PostgreSQL是否足够聪明,可以避免为每一行重新运行常量连接表达式?

i2loujxw  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(131)

如果联接或子选择不依赖于行中的任何其他内容,那么Postgres是否足够聪明,不对每个结果行重新运行联接或子选择?
举例来说:
在Postgres中,我有两个表,accountprofile。我想写一个查询,返回所有活跃用户的配置文件,只有当调用用户(其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)。但是,第一次外部连接是对每一行执行(浪费工作),还是只执行一次,然后复制到结果集的每一行?

r1wp621o

r1wp621o1#

通常,PostgreSQL查询规划器足够智能,可以识别出在哪些情况下,查询的一部分可能只对整个结果集计算一次,而不依赖于正在处理的行。通过只计算一次初始连接的结果并重用它,它可能会适当地优化执行计划。检查EXPLAIN输出以获得规划器选择的特定执行计划。

EXPLAIN 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';

字符串
希望对你有帮助:)

相关问题