pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
ANALYZE — 收集数据库的统计信息
ANALYZE [ VERBOSE ] [table[ (column[, ...] ) ] ]
ANALYZE收集数据库中各表内容的统计信息,并将结果存储到pg_statistic 系统目录中。随后,查询规划器会使用这些统计信息来帮助确定查询的最高效执行计划。
如果不带参数,ANALYZE 会检查当前数据库中的每个表。带有参数时,ANALYZE 只检查该表。还可以提供列名列表,这时只会收集这些列的统计信息。
VERBOSE启用进度消息显示。
table要分析的特定表的名称(可带模式限定)。默认为当前数据库中的所有表。
column要分析的特定列的名称。默认为所有列。
指定VERBOSE时,ANALYZE会输出进度消息, 指示当前正在处理哪个表,同时还会打印这些表的各种统计信息。
在默认的 PostgreSQL 配置中,自动清理守护进程(见 第 23.1.5 节)会在表首次装载数据时,以及在常规运行过程中数据发生变化时,自动分析这些表。当自动清理被禁用时,最好定期运行 ANALYZE,或者在对表内容做出重大更改之后立即运行。准确的统计信息有助于规划器选择最合适的查询计划,从而提高查询处理速度。一个常见的策略是在每天使用率较低的时段运行一次 VACUUM 和 ANALYZE。
ANALYZE只需获取目标表上的读锁,因此可以与该表上的其他活动并行运行。
ANALYZE收集的统计信息通常包括每列中某些高频值的列表,以及显示每列大致数据分布的直方图。如果ANALYZE认为它们没有意义(例如,唯一键列中没有高频值),或者列的数据类型不支持相应的操作符,则可能省略其中一项或两项。更多统计信息见第 23 章。
对于大型表,ANALYZE会对表内容进行随机采样,而不是检查每一行。 这使得即使是很大的表,也能在较短时间内完成分析。不过要注意,这些统计信息只是近似值, 并且即使实际表内容没有变化,每次运行ANALYZE时统计信息也会略有变化。 这可能导致EXPLAIN中显示的规划器估算代价略有变化。 在少数情况下,这种非确定性会导致规划器在运行ANALYZE之后改用不同的查询计划。 要避免这种情况,可以按下文所述提高ANALYZE收集的统计信息量。
可以通过调整配置变量default_statistics_target来控制分析程度, 也可以针对单个列使用ALTER TABLE ... ALTER COLUMN ... SET STATISTICS设置每列的统计信息目标(参见ALTER TABLE)。目标值会设置高频值列表中的最大条目数, 以及直方图中的最大桶数。默认目标值是 100,但可以把它调高或调低,以在规划器估算精度、 ANALYZE耗费的时间以及pg_statistic占用的空间之间作出权衡。 特别地,将统计信息目标设置为零会禁用该列的统计信息收集。对于那些从不出现在查询 WHERE、GROUP BY或ORDER BY子句中的列, 这样做可能很有用,因为规划器不会用到这些列的统计信息。
被分析列中最大的统计信息目标决定了为了生成统计信息而需要采样的表行数。 增加该目标会导致执行ANALYZE所需的时间和空间按比例增加。
ANALYZE估算的值之一是每一列中出现的非重复值数量。由于只检查了部分行, 即使使用可能的最大统计信息目标,这种估计有时也可能相当不精确。如果这种不精确导致查询计划不佳, 就可以手工确定一个更精确的值,然后用 ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...) 把该值设置进去(参见ALTER TABLE)。
如果被分析的表有一个或多个子表,ANALYZE 会两次收集统计信息:一次只针对父表中的行,另一次针对父表及其所有子表中的行。不过,自动清理守护进程在决定是否为该表触发自动分析时,只会考虑对父表本身的插入或更新。如果该表很少被插入或更新,那么除非手工运行 ANALYZE,否则继承统计信息就不会保持最新。
SQL 标准中没有ANALYZE语句。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。