ANALYZE

ANALYZE —收集有关数据库的统计信息

Synopsis

ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]

where option can be one of:

    VERBOSE

and table_and_columns is:

    table_name [ ( column_name [, ...] ) ]

Description

ANALYZE收集有关数据库中表内容的统计信息,并将结果存储在pg_statistic系统目录中。随后,查询计划者使用这些统计信息来帮助确定最有效的查询执行计划。

如果没有* table_and_columns *列表,则ANALYZE将处理当前用户有权分析的当前数据库中的每个表和实例化视图。对于列表,ANALYZE仅处理那些表。还可以提供表的列名列表,在这种情况下,仅收集这些列的统计信息。

当选项列表用括号括起来时,可以按任何 Sequences 写入选项。括号中的语法是在 PostgreSQL 11 中添加的;不带括号的语法已弃用。

Parameters

  • VERBOSE

    • 启用进度消息的显示。
  • table_name

    • 要分析的特定表的名称(可能是模式限定的)。如果省略,则分析当前数据库中的所有常规表,分区表和实例化视图(但不分析外部表)。如果指定的表是分区表,则整个分区表的继承统计信息和各个分区的统计信息都将更新。
  • column_name

    • 要分析的特定列的名称。默认为所有列。

Outputs

当指定VERBOSE时,ANALYZE发出进度消息以指示当前正在处理哪个表。还将打印有关表格的各种统计信息。

Notes

要分析表,通常必须是表的所有者或超级用户。但是,允许数据库所有者分析其数据库中的所有表(共享目录除外)。 (共享目录的限制意味着 true 的数据库范围内的ANALYZE只能由超级用户执行.)ANALYZE将跳过主叫用户无权分析的任何表。

仅在明确选择外部表时才对其进行分析。并非所有外部数据包装器都支持ANALYZE。如果表的包装器不支持ANALYZE,则该命令将显示警告并且不执行任何操作。

在默认的 PostgreSQL 配置中,autovacuum 守护程序(请参见Section 24.1.6)负责在表首次加载数据时以及在整个常规操作过程中更改时自动分析表。如果禁用了 autovacuum,则最好定期运行ANALYZE,或者在对表内容进行重大更改之后立即运行ANALYZE。准确的统计信息将帮助计划者选择最合适的查询计划,从而提高查询处理的速度。只读数据库的常见策略是在一天的低使用时间内每天运行一次VACUUMANALYZE。 (如果有大量更新活动,这将是不够的.)

ANALYZE仅需要对目标表进行读取锁定,因此它可以与表上的其他活动并行运行。

ANALYZE收集的统计信息通常包括每列中一些最常用值的列表以及显示每列中近似数据分布的直方图。如果ANALYZE认为它们不感兴趣(例如,在唯一键列中没有公共值),或者列数据类型不支持适当的运算符,则可以忽略其中一个或两个。 Chapter 24中提供了有关统计信息的更多信息。

对于大型表,ANALYZE随机抽取表内容 samples,而不是检查每一行。这样就可以在很短的时间内分析非常大的表。但是请注意,统计信息仅是近似值,并且每次运行ANALYZE都会略有变化,即使实际的表内容没有变化。这可能会导致EXPLAIN所示的计划者估算费用发生细微变化。在极少数情况下,这种不确定性将导致计划程序在运行ANALYZE之后更改查询计划的选择。为避免这种情况,请增加ANALYZE收集的统计量,如下所述。

可以通过调整default_statistics_target配置变量来控制分析范围,或者通过将每个列的统计目标设置为ALTER TABLE ... ALTER COLUMN ... SET STATISTICS(请参见ALTER TABLE)来控制逐列。目标值设置最常用值列表中的最大条目数和直方图中的最大 bin 数。默认目标值为 100,但是可以向上或向下调整此值,以权衡ANALYZE所花费的时间和pg_statistic中占用的空间量,从而权衡规划师估计的准确性。特别是,将统计目标设置为零会禁用该列的统计收集。对从未用作查询WHEREGROUP BYORDER BY子句一部分的列进行此操作可能很有用,因为计划器将不会使用此类列的统计信息。

要分析的列中最大的统计信息目标确定为准备统计信息而采样的表行数。增加目标会导致执行ANALYZE所需的时间和空间成比例增加。

ANALYZE估算的值之一是出现在每列中的不同值的数量。因为只检查了行的子集,所以即使使用最大可能的统计目标,此估计有时也可能非常不准确。如果此错误导致查询计划不正确,则可以手动确定更准确的值,然后使用ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...)进行安装(请参见ALTER TABLE)。

如果要分析的表有一个或多个子表,ANALYZE将收集两次统计信息:一次仅在父表的行上,第二次在父表及其所有子表的行上。当计划遍历整个继承树的查询时,需要第二组统计信息。但是,autovacuum 守护程序在决定是否触发对该表的自动分析时仅考虑对父表本身进行插入或更新。如果该表很少插入或更新,除非您手动运行ANALYZE,否则继承统计信息不会是最新的。

如果任何子表是外部数据包装不支持ANALYZE的外部表,则在收集继承统计信息时将忽略这些子表。

如果要分析的表完全为空,则ANALYZE将不会记录该表的新统计信息。任何现有的统计信息都将保留。

Compatibility

SQL 标准中没有ANALYZE语句。

See Also

VACUUM, vacuumdb, Section 19.4.4, Section 24.1.6