ANALYZE
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语句。