【发布时间】:2018-09-05 16:59:14
【问题描述】:
想象一下,我有这个 SQL 查询,而 table2 是巨大的。
select product_id, count(product_id)
from table1
where table2_ptr_id in (select id
from table2
where author is not null)
SQL 会先执行子查询,然后将 table2 全部加载到内存中吗?就像如果 table1 有 10 行,而 table2 有 1000 万行,那么先加入然后过滤会更好吗?或者 DB 足够聪明,可以在编写此查询时对其进行优化。
【问题讨论】:
-
数据库实际上更智能。他们接受查询,检查索引和统计信息,并将查询转换为利用任何现有索引的实际执行计划,使用基于数据统计的不同匹配算法等。如果
author和id仅出现在索引中将使用索引数据页。 -
我建议您开始使用
EXPLAIN和EXPLAIN ANALYZE来了解有关PostgreSQL 中查询计划和执行的更多信息。 PostgreSQL's documentation 中提供了这些语句及其输出的详细信息。
标签: postgresql