Postgres 子查询执行步骤
Posted
技术标签:
【中文标题】Postgres 子查询执行步骤【英文标题】:Postgres subquery execution steps 【发布时间】:2019-01-25 04:35:17 【问题描述】:假设我有一个查询
Select * from (
select coalesce(mytable.created_date,mytable1.created_date) as created_date,...
from mytable
left join mytable1 ON (mytable.id=mytable1.id)
--Other Joins and tables here
) as foo
where created_date > CURRENT_DATE
Postgres 是否会仅选择 created_date is > CURRENT_DATE
用于内部查询的行,我将在其中加入许多表?
或者它会从mytable
获取所有行并在内部查询中与其他表进行连接,然后检查created_date > CURRENT_DATE
。
我之前的查询和之前的查询一样吗
select coalesce(mytable.created_date,mytable1.created_date),... from mytable
left join mytable1 ON (mytable.id=mytable1.id)
--Other Joins and tables here
WHERE
coalesce(mytable.created_date,mytable1.created_date) > CURRENT_DATE
【问题讨论】:
您应该运行 EXPLAIN 并查看 Postgres 正在做什么来为您带来输出。 【参考方案1】:正如您在使用EXPLAIN
时所看到的,优化器可以“展平”此类子查询,从而使这两个查询的执行计划相同。
换句话说,优化器能够将WHERE
条件推送到子查询和连接中,从而可以先执行。
此外,如果created_date
恰好是mytable1
的一列,PostgreSQL 将推断created_date
永远不能为NULL,并执行内连接而不是外连接。
【讨论】:
以上是关于Postgres 子查询执行步骤的主要内容,如果未能解决你的问题,请参考以下文章
Python-Sqlalchemy-Postgres:如何将子查询结果存储在变量中并将其用于主查询