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:如何将子查询结果存储在变量中并将其用于主查询

postgres:使用子查询设置数组的值?

FROM 子句中的 Postgres 子查询

Postgres:使用子查询更新表列

Postgres 中的子查询根据 sum 函数给出不正确的结果

如何在子查询中使用 select 语句? (Postgres)