EXPLAIN 与 EXPLAIN ANALYZE
PostgreSQL 中的 EXPLAIN ANALYZE 有什么作用?
EXPLAIN 显示 PostgreSQL 打算如何执行查询;EXPLAIN ANALYZE 还会实际执行查询,并报告每个步骤的实际行数和耗时。
EXPLAIN 会输出规划器为语句选择的执行策略:读取哪些表以及如何读取,使用哪些连接方法,以及每一步的估算代价和行数。加上 ANALYZE 选项后,PostgreSQL 会真正执行该语句,并在估算值旁边加上实际耗时和行数。
对比估算行数与实际行数,是发现统计信息过时或访问方法选择不当的最快方式。BUFFERS 选项会额外显示有多少页在共享内存中找到、有多少页需要读取。由于 EXPLAIN ANALYZE 会真正执行语句,如果只想检查会修改数据的语句,请将其包裹在 BEGIN 和 ROLLBACK 之间。
示例
该示例在一张该列没有索引的表中查找一个邮箱地址。输出显示一个 Seq Scan,包含估算和实际行数、耗时以及缓冲区统计信息。
CREATE TABLE users (id int PRIMARY KEY, email text);
INSERT INTO users
SELECT g, 'user' || g || '@example.com' FROM generate_series(1, 50000) AS g;
ANALYZE users;
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM users WHERE email = 'user42@example.com';适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。