Postgres子查询执行步骤

时间:2019-01-25 04:35:17

标签: postgresql subquery query-optimization

假设我有一个查询,内容为

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

1 个答案:

答案 0 :(得分:1)

正如您在使用EXPLAIN时看到的那样,优化器可以“展平”此类子查询,以使这两个查询的执行计划相同。

换句话说,优化器能够将WHERE条件推入子查询和联接中,以便可以首先执行它。

此外,如果created_date恰好是mytable1的一列,则PostgreSQL会推断created_date永远不能为NULL并执行内部联接而不是外部联接。