Postgresql 中文操作指南

ANALYZE

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

Synopsis

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

where option can be one of:

    VERBOSE [ boolean ]
    SKIP_LOCKED [ boolean ]
    BUFFER_USAGE_LIMIT size

and table_and_columns is:

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

Description

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

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

当选项列表被括号包围时,可以按任何顺序编写选项。PostgreSQL 11 中添加了带括号的语法;不带括号的语法已被弃用。

Parameters

  • VERBOSE

    • 启用进度消息显示。

  • SKIP_LOCKED

    • 指定 ANALYZE 在开始针对关系执行工作时不应等待任何冲突的锁释放:如果无法立即无等待地锁定关系,则跳过该关系。注意,即使有该选项, ANALYZE 在打开关系索引或从分区、表继承子代和某些类型的外键表获取样本行时仍可能会阻塞。此外,虽然 ANALYZE 通常处理指定分区表的全部分区,但是如果分区表上存在冲突锁,此选项会导致 ANALYZE 跳过所有分区。

  • BUFFER_USAGE_LIMIT

    • 指定用于 ANALYZE 的[role="bare"]glossary.html#GLOSSARY-BUFFER-ACCESS-STRATEGY Buffer Access Strategy 环形缓冲区大小。此大小用于计算将作为此策略的一部分重用的共享缓冲区的数量。 0 禁用 Buffer Access Strategy 的使用。如果未指定此选项, ANALYZE 将使用 vacuum_buffer_usage_limit 中的值。较高的设置能使 ANALYZE 运行得更快,但设置过高可能会导致太多其他有用的页面从共享缓冲区中逐出。最小值为 128 kB ,最大值为 16 GB

  • boolean

    • 指定所选选项应该开启还是关闭。您可以编写 TRUEON1 来启用该选项,并编写 FALSEOFF0 来禁用它。也可以省略 boolean 值,在这种情况下假定 TRUE

  • size

    • 指定以千字节为单位的内存量。大小还可以指定为一个字符串,其中包含数字大小后跟以下任何一个内存单位: B (字节), kB (千字节), MB (兆字节), GB (千兆字节)或 TB (太字节)。

  • table_name

    • 要分析的特定表的名称(可能带有模式限定)。如果未指定,则分析当前数据库中的所有常规表、分区表和物化视图(但外键表除外)。如果指定表为分区表,则将同时更新分区表的继承统计信息和各个分区的统计信息。

  • column_name

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

Outputs

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

Notes

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

外键表只能在明确选择时进行分析。并非所有外键数据包装器都支持 ANALYZE 。如果该表的包装器不支持 ANALYZE ,该命令会打印一个警告,并且不执行任何操作。

在默认 PostgreSQL 配置中,自动真空守护进程(请参阅 Section 25.1.6 )在首次向表加载数据时以及在整个常规操作过程中表发生更改时,负责表的自动分析。禁用自动真空时,建议定期运行 ANALYZE ,或者刚好在表的内容中进行了重大更改之后运行。准确的统计数据将帮助规划器选择最合适的查询计划,从而提高查询处理速度。仅读数据库的共同策略是在一天中使用率较低的时间段内每天运行一次 VACUUMANALYZE 。(如果有繁重的更新活动,这将不足以应对。)

ANALYZE 只需要读锁对目标表进行锁定,这样便可在与表中的其他活动并行运行时。

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

对于较大的表, ANALYZE 会对表内容进行随机抽样,而不是检查每一行。这样即使是非常大的表也可以在短时间内完成分析。然而,请注意统计数据只是一种近似,并且每次运行 ANALYZE 时都会略有变化,即使实际表内容没有更改。这可能会导致 EXPLAIN 显示的规划器估算成本中出现小幅更改。在极少数情况下,这种不确定性会导致规划器在运行 ANALYZE 之后更改查询计划的选择。为避免这种情况,请提高 ANALYZE 收集的统计数据量,如下所述。

可以通过调整 default_statistics_target 配置变量或者通过 ALTER TABLE …​ ALTER COLUMN …​ SET STATISTICS 为每列设置每列统计信息目标来控制分析范围。目标值设置最常见值列表中的最大条目数和直方图中的最大槽数。默认目标值为 100,但可以向上或向下调整目标值,以平衡规划器估算的准确性与运行 ANALYZE 所需时间和 pg_statistic 占据的空间。特别是,将统计信息目标设为零将禁用对该列统计信息进行收集。对不会作为查询的 WHEREGROUP BYORDER BY 子句的一部分使用的列执行此操作可能有用,因为规划器将无法使用此类列上的统计信息。

要分析的列中最多的统计信息目标将决定要准备这些统计信息时所抽样的表行数。增加目标值将使 ANALYZE 所需时间和空间成比例增加。

ANALYZE 估算的一个值是各列中出现的唯一值的数量。由于只检查了子集行,因此即使具有最大的统计信息目标,有时该估算可能相当不准确。如果这种不准确性导致糟糕的查询计划,可以手动确定一个更准确的值,然后使用 ALTER TABLE …​ ALTER COLUMN …​ SET (n_distinct = …​) 安装。

如果要分析的表具有继承子项, ANALYZE 将收集两组统计数据:一组仅针对父表的行,另一组包括父表的行和所有子表的行。在将继承树作为一个整体进行处理的查询规划时需要这第二组数据。在这种情况下,不会单独分析子表。然而,自动真空守护进程在决定是否对该表触发自动分析时,只会考虑父表本身的插入或更新。如果很少插入或更新该表,则除非您手动运行 ANALYZE ,否则继承统计信息将不会是最新的。

对于分区表, ANALYZE 通过从所有分区抽样行来收集统计信息;此外,它还会递归到每个分区并更新其统计信息。即使是多级分区,每个叶分区也只进行一次分析。不会仅针对父表(不包含其分区中的数据)收集统计信息,因为在分区的情况下,该表保证是空的。

自动真空守护进程不会处理分区表,也不会处理仅修改了子项的继承父项。通常需要定期手动运行 ANALYZE 以保持表层次结构的统计信息是最新的。

如果任何子表或分区的外国数据包装器不支持 ANALYZE 的话,则在收集继承统计信息时会忽略这些表。

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

每个运行 ANALYZE 的后端都会在 pg_stat_progress_analyze 视图中报告其进度。有关详细信息,请参阅 Section 28.4.1

Compatibility

SQL 标准中没有 ANALYZE 语句。