Postgresql SQL是否完全执行子查询?
假设我有一个SQL查询,表2是巨大的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万行,那么
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中查询计划和执行的更多信息。有关这些语句及其输出的详细信息,请参阅。