pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
ANALYZE — 收集关于数据库的统计信息
ANALYZE [ VERBOSE ] [table[ (column[, ...] ) ] ]
ANALYZE收集数据库中表内容的统计信息,并把结果 存储在系统表pg_statistic中。随后,查询规划器 使用这些统计信息来帮助确定查询最有效的执行计划。
不带参数时,ANALYZE检查当前数据库中的每个表。 带参数时,ANALYZE只检查该表。还可以给出一个 列名列表,这种情况下只收集这些列的统计信息。
VERBOSE启用进度消息的显示。
table要分析的一个指定表的名称(可以是模式限定的)。默认为当前 数据库中的所有表。
column要分析的一个指定列的名称。默认为所有列。
指定VERBOSE时,ANALYZE会发出进度消息, 指明当前正在处理哪个表。还会打印关于表的各种统计信息。
定期运行ANALYZE,或者在一个表的内容发生重大 变化之后紧接着运行它,是个好主意。准确的统计信息能帮助规划器 选择最合适的查询计划,从而提高查询处理的速度。常见的策略是 每天在使用率低的时段运行一次VACUUM 和ANALYZE。
与VACUUM FULL不同,ANALYZE 只需要对目标表的读锁,因此它可以与该表上的其他活动并行运行。
ANALYZE收集的统计信息通常包括每个列中一些 最常见值的列表,以及显示每个列中近似数据分布的直方图。如果 ANALYZE认为它们没有意义(例如在唯一键列中 没有常见值),或者列数据类型不支持适当的操作符,则可以省略 其中之一或两者。关于统计信息的更多信息见第 21 章。
对于大型表,ANALYZE对表内容抽取随机样本, 而不是检查每一行。这使得即使非常大的表也能在很短时间内完成 分析。但要注意,统计信息只是近似的,即使表的实际内容没有 变化,每次运行ANALYZE的结果也会略有不同。 这可能导致EXPLAIN显示的规划器估计代价发生 小的变化。在罕见的情况下,这种非确定性会导致查询优化器在 两次ANALYZE运行之间选择不同的查询计划。 要避免这一点,可以增大ANALYZE收集的统计 信息量,方法如下所述。
分析的深度可以通过调整DEFAULT_STATISTICS_TARGET 参数变量来控制,也可以逐列地用ALTER TABLE ... ALTER COLUMN ... SET STATISTICS设置每列的统计目标来控制 (见ALTER TABLE)。目标值设定了最常见值列表中的 最大条目数和直方图中的最大桶数。默认的目标值是 10,可以调高或 调低,以便在规划器估计的准确性与ANALYZE所 花费的时间以及pg_statistic中占用的空间之间 做出权衡。特别地,把统计目标设置为零将禁用该列的统计信息收集。 对于从不用作查询的WHERE、GROUP BY或 ORDER BY子句部分的列,这样做可能有用,因为规划器 不会用到这类列的统计信息。
被分析各列中最大的统计目标决定了为准备统计信息而采样的表行数。 提高目标会使执行ANALYZE所需的时间和空间 成比例地增加。
SQL 标准中没有ANALYZE语句。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。