假设我有一个查询,内容为
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
答案 0 :(得分:1)
正如您在使用EXPLAIN
时看到的那样,优化器可以“展平”此类子查询,以使这两个查询的执行计划相同。
换句话说,优化器能够将WHERE
条件推入子查询和联接中,以便可以首先执行它。
此外,如果created_date
恰好是mytable1
的一列,则PostgreSQL会推断created_date
永远不能为NULL并执行内部联接而不是外部联接。