Postgresql SQL是否完全执行子查询?

Postgresql SQL是否完全执行子查询?,postgresql,Postgresql,假设我有一个SQL查询,表2是巨大的 select product_id, count(product_id) from table1 where table2_ptr_id in (select id from table2 where author is not null) SQL会首先执行子查询并将所有表2加载到内存中吗?比如,如果table1有10行,table2有1000万行,那么

假设我有一个SQL查询,表2是巨大的

select product_id, count(product_id) 
from table1 
where table2_ptr_id in (select id 
                        from table2 
                        where author is not null)

SQL会首先执行子查询并将所有表2加载到内存中吗?比如,如果table1有10行,table2有1000万行,那么先加入然后过滤会更好吗?或者DB足够聪明,可以在编写查询时对其进行优化。

您必须
解释该查询,才能知道它在做什么

但是,如果将查询重写为

SELECT product_id
FROM table1 
WHERE EXISTS (SELECT 1
              FROM table2
              WHERE table2.id = table1.table2_ptr_id
              AND table2.author IS NOT NULL);
然后PostgreSQL可以使用反连接,这可能会在使用巨大的
表2
时表现得更好


备注:查询中的
计数对我来说没有任何意义。

数据库实际上更智能。它们接受查询、检查索引和统计信息,并将查询转换为利用任何现有索引的实际执行计划,基于数据统计等使用不同的匹配算法。如果索引中出现
author
id
,则只会使用索引数据页。我建议您开始使用
EXPLAIN
EXPLAIN ANALYZE
来了解有关PostgreSQL中查询计划和执行的更多信息。有关这些语句及其输出的详细信息,请参阅。