全部术语

顺序扫描

PostgreSQL 中的顺序扫描是什么?

顺序扫描会从头到尾读取表中的每一行。EXPLAIN 将其显示为 Seq Scan;对于小表或返回大量行的查询,这是常规的选择。

顺序扫描(EXPLAIN 输出中的 Seq Scan)按顺序读取表的所有页,并逐行检查是否满足查询条件。它不需要索引,也是没有可用索引时规划器的兜底方案。

Seq Scan 本身并不一定是问题。对于小表,或者当查询返回表中很大比例的行时,读取整张表可能比在索引和表之间来回跳转更划算。真正需要关注的是:为了返回少数几行而完整读取一张大表;这时通常在过滤列上建立索引即可解决。规划器根据表的统计信息做出决策,因此在加载大量数据后要运行 ANALYZE。

示例

该示例加载 100,000 行数据,用 ANALYZE 收集统计信息,然后通过 EXPLAIN 查看 PostgreSQL 会如何在一个没有索引的列上进行过滤。输出显示 Seq Scan on events。

CREATE TABLE events (id int, kind text);
INSERT INTO events
SELECT g, 'k' || (g % 10) FROM generate_series(1, 100000) AS g;
ANALYZE events;

EXPLAIN SELECT * FROM events WHERE kind = 'k3';

适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。

参考资料

PostgreSQL 官方文档(英文)。

相关术语