• 热门
  • 基础
  • 数据库
  • 安全
  • 大数据
  • 人工智能
  • 混合云
  • 开发与运维
  • 企业应用

应用服务

行业引擎

全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

ANALYZE

最近更新时间:2024-11-26 18:14:31

收集数据库的统计信息。


语法

ANALYZE [VERBOSE] [ (SKIP_LOCKED) ] [<table> [ (<column> [, ...] ) ]]

描述

ANALYZE 收集数据库表中的内容统计信息,并将结果存储在系统表 pg_statistic 中。后续操作中,Relyt 会使用这些统计信息来帮助确定查询的最有效的执行计划。有关收集的表统计信息,请参见本章使用注意事项。

如果没有参数,ANALYZE 将收集当前数据库中每个表的统计信息。你可以指定表名来收集单个表的统计信息。你可以在特定表中指定一组列名,这样只会收集来自该表的这些列的统计信息。

ANALYZE 不收集外部表的统计信息。


参数

  1. VERBOSE

启用显示进度消息。当指定该选项时,ANALYZE 发出以下信息:

  • 正在处理的表。

  • 用于生成样本表的查询。

  • 正在计算统计信息的列。

  • 为单列收集不同统计信息的查询。

  • 收集的统计信息。

  1. SKIP_LOCKED

指定ANALYZE 在开始处理表时不等待任何冲突锁被释放:如果不能立即锁定表而不等待,它将跳过该表。请注意,即使有此选项,ANALYZE 在打开表的索引或从表继承子表获取样本行时仍可能产生阻塞。

  1. <table>

表的名称,支持使用 Schema 名称进行限定。如不提供该参数,当前数据库中的所有常规表都会被分析。

  1. <column>

要分析列的名称。如果不指定该参数,表中的所有列都会被分析。


使用注意事项

推荐定期运行ANALYZE 或在对表内容进行重大更改后运行ANALYZE。准确的统计信息可以帮助 Relyt 选择最合适的查询计划,从而提高查询处理的速度。对于读密集型数据库,你可以在业务低峰期运行 VACUUMANALYZE。(不适用于涉及大量更新活动的场景。)你可以使用位于gp_toolkit Schema 中的 gp_stats_missing 视图检查缺少统计信息的表:

SELECT * FROM gp_toolkit.gp_stats_missing;

ANALYZE 需要获取目标表上的 SHARE UPDATE EXCLUSIVE 锁。此锁与SHARE UPDATE EXCLUSIVESHARESHARE ROW EXCLUSIVEEXCLUSIVEACCESS EXCLUSIVE 锁冲突。

如果你在一个不包含数据的表上运行 ANALYZE,则不会收集该表的统计信息。例如,如果你对具有统计信息的表执行 TRUNCATE 操作,然后在该表上运行 ANALYZE,则统计信息不会改变。

ANALYZE 收集的统计信息通常包括每列中一些最常见值的列表,以及一个显示每列近似数据分布的直方图。如果 ANALYZE 认为这些信息不重要(例如,对于唯一键列,没有常见值)或者列的数据类型不支持相关操作符,这两者都可能被省略。

对于大表,ANALYZE 会随机抽取表中的样本数据,而非逐行检查。这使得即使是非常大的表也能在较短时间内完成分析。然而,需要注意的是,统计信息仅为近似值,即便表的实际内容没有发生变化,每次运行 ANALYZE 时统计结果可能略有不同。这可能导致查询计划器在 EXPLAIN 中显示的估算成本发生轻微变化。在极少数情况下,这种非确定性可能导致查询优化器在不同的 ANALYZE 执行之间选择不同的查询计划。为避免这种情况,可以通过调整 default_statistics_target 配置参数增加 ANALYZE 收集的统计数据量,或者通过 ALTER TABLE ... ALTER COLUMN ... SET (n_distinct ...) 为各列单独设置统计目标(详见ALTER TABLE)。该目标值决定了最常见值列表中的最大条目数和直方图中的最大区间数。默认目标值为 100,但可以根据需要进行调整,以在计划器估算的准确性、ANALYZE 执行时间及 pg_statistic 中占用的存储空间之间做出权衡。尤其是,将统计目标设置为零会禁用对该列的统计信息收集。对于从未在查询的 WHEREGROUP BYORDER BY 子句中使用的列,这可能是有益的,因为计划器无需这些列的统计信息。

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

ANALYZE 估计的一个值是每列中出现的不同值的数量。因为只有部分行被检查,即使在最大可能的统计目标下,这个估计有时也可能相当不准确。

当 Relyt 执行 ANALYZE 操作来收集表的统计信息,并检测到所有抽样的表数据页都是空的(不包含有效数据)时,Relyt 会显示应该执行 VACUUM FULL 操作的消息。如果抽样页面为空,则表统计信息将不准确。在对表进行大量更改后,页面会变为空,例如删除大量行。VACUUM FULL 操作会删除空页面,允许 ANALYZE 操作收集准确的统计信息。

如果表没有统计信息,则通过服务器配置参数 gp_enable_relsize_collection 来控制 Postgres Planner 是使用默认的统计文件还是通过 pg_relation_size 函数估算表的大小。默认情况下,如果没有统计信息,Postgres Planner 会使用默认的统计文件来估算行数。


示例

收集表 sales 的统计信息:

ANALYZE sales;

SQL 标准兼容性

标准 SQL 中没有 ANALYZE 语句。

纯净模式常规模式

纯净模式

点击可全屏预览文档内容

鼠标选中内容,快速反馈问题

如果在文档使用中出现问题,可选中有问题的部分进行快速反馈,我们将跟进处理。
不再提示
好的,我知道了

聆听反馈