# 分析

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

# 概要

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

where option can be one of:

    VERBOSE [ boolean ]
    SKIP_LOCKED [ boolean ]

and table_and_columns is:

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

# 描述

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

没有*表和列*列表,分析处理当前用户有权分析的当前数据库中的每个表和物化视图。带着清单,分析仅处理那些表。还可以给出一个表的列名列表,在这种情况下,只收集这些列的统计信息。

When the option list is surrounded by parentheses, the options can be written in any order.括号中的语法是在 PostgreSQL 11 中添加的;不推荐使用带括号的语法。

# 参数

详细

启用进度消息的显示。

SKIP_LOCKED

指定分析在开始处理关系时不应等待释放任何冲突的锁:如果不等待就无法立即锁定关系,则跳过该关系。请注意,即使使用此选项,分析打开关系的索引或从分区、表继承子表和某些类型的外部表获取示例行时,仍可能会阻塞。另外,虽然分析通常处理指定分区表的所有分区,该选项将导致分析如果分区表上存在冲突锁,则跳过所有分区。

布尔值

指定是否应打开或关闭所选选项。你可以写真的,, 要么1启用该选项,并且错误的,离开, 要么0禁用它。这*布尔值*value 也可以省略,在这种情况下真的假设。

表名

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

列名

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

# 输出

什么时候详细被指定,分析发出进度消息以指示当前正在处理哪个表。还打印了有关表的各种统计信息。

# 笔记

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

仅在显式选择时才分析外部表。并非所有外部数据包装器都支持分析.如果表的包装器不支持分析,该命令打印一个警告并且什么都不做。

在默认的 PostgreSQL 配置中,autovacuum 守护进程(参见第 25.1.6 节) 负责在第一次加载数据时对表进行自动分析,并在它们在整个常规操作过程中发生变化时进行自动分析。当 autovacuum 被禁用时,最好运行分析定期,或者在对表的内容进行重大更改之后。准确的统计信息将帮助计划者选择最合适的查询计划,从而提高查询处理的速度。以读取为主的数据库的一个常见策略是运行真空分析在一天中的低使用时间每天一次。(如果有大量更新活动,这将是不够的。)

分析只需要目标表上的读锁,因此它可以与表上的其他活动并行运行。

收集的统计数据分析通常包括每列中一些最常见值的列表和显示每列中近似数据分布的直方图。如果满足以下条件,则可以省略其中一项或两项分析认为它们无趣(例如,在唯一键列中,没有公共值)或者列数据类型不支持适当的运算符。有更多关于统计的信息第 25 章.

对于大桌子,分析对表格内容进行随机抽样,而不是检查每一行。这允许在很短的时间内分析非常大的表。但请注意,统计数据只是近似值,每次都会略有变化分析运行,即使实际的表内容没有改变。这可能会导致计划者的估计成本发生微小变化,如下所示解释.在极少数情况下,这种不确定性会导致规划者对查询计划的选择在分析正在运行。为避免这种情况,请提高收集的统计数据量分析,如下所述。

分析的范围可以通过调整默认_统计数据_目标配置变量,或逐列设置每列统计目标更改表 ... 更改列 ... 设置统计信息.目标值设置最常用值列表中的最大条目数和直方图中的最大 bin 数。默认目标值为 100,但可以上下调整,以权衡计划者估计的准确性与分析和占用的空间量pg_statistic.特别是,将统计目标设置为零会禁用该列的统计信息收集。对于从未用作在哪里,通过...分组, 要么订购方式查询子句,因为规划器不会使用此类列的统计信息。

正在分析的列中最大的统计目标决定了为准备统计数据而抽样的表行数。增加目标会导致需要做的时间和空间成比例增加分析.

估计值之一分析是每列中出现的不同值的数量。因为只检查了行的一个子集,所以这个估计有时可能非常不准确,即使是最大可能的统计目标。如果这种不准确性导致错误的查询计划,可以手动确定更准确的值,然后安装ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...).

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

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

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

每个后端运行分析将报告其进展情况pg_stat_progress_analyze看法。看第 28.4.1 节详情。

# 兼容性

没有分析SQL 标准中的语句。

# 也可以看看

真空,真空数据库,第 20.4.4 节,第 25.1.6 节,第 28.4.1 节