更新时间:2025-09-11 GMT+08:00
分享

ANALYZE

功能描述

用于收集与数据库中普通表内容相关的统计信息,统计结果存储在系统表pg_statistic、pg_statistic_ext下,执行ANALYZE命令后,可在上述系统表中查询收集到的统计信息,也可以通过系统视图pg_stats、pg_ext_stats查询信息。执行计划生成器会使用这些统计数据,以确定最有效的执行计划。

如果没有指定参数,ANALYZE会分析当前数据库中的每个表和分区表。同时也可以通过指定table_name、column_name和partition_name参数把分析限定在特定的表、列或分区表中。

每次收集的统计信息,都会存入统计信息历史表(gs_statistic_history、gs_statistic_ext_history、gs_statistic_history)中,历史表存放的数量和统计信息的保留时间由GUC参数stats_history_record_limit和stats_history_retention_time控制。

注意事项

  • ANALYZE非临时表不能在一个匿名块、事务块、函数或存储过程内被执行。支持存储过程中ANALYZE临时表,不支持统计信息回滚操作。
  • ANALYZE VERIFY操作处理的大多为异常场景检测需要使用RELEASE版本。ANALYZE VERIFY 场景不触发远程读,因此远程读参数不生效。对于关键系统表出现错误被系统检测出页面损坏时,将直接报错不再继续检测。
  • 如果没有指定参数,ANALYZE处理当前数据库里用户拥有相应权限的每个表。如果参数中指定了表,ANALYZE只处理指定的表。
  • 要对一个表进行ANALYZE操作,通常用户必须是表的所有者或者被授予了指定表ANALYZE权限的用户,三权分立开关关闭时,默认系统管理员有该权限。数据库的所有者允许对数据库中除了共享目录以外的所有表进行ANALYZE操作(该限制意味着只有系统管理员才能真正对一个数据库进行ANALYZE操作)。ANALYZE命令会跳过那些用户没有权限的表。
  • ANALYZE不收集无法做比较或等值运算的列,例如cursor类型。

语法格式

  • 收集表的统计信息。
    ANALYZE [ VERBOSE ]
        [ table_name [ ( column_name [, ...] ) ] ] ;
  • 收集分区表的分区统计信息。
    ANALYZE [ VERBOSE ]
        table_name [ ( column_name [, ...] ) ] PARTITION ( partition_name ) ;
    
    收集表的索引信息
    ANALYZE [ VERBOSE ] GLOBAL INDEX index_name FOR TABLE table_name;

    使用关键字PARTITION,partition_name必须为一级分区名字。

  • 手动收集多列统计信息。
    ANALYZE [ VERBOSE ]
        table_name (( column_1_name, column_2_name [, ...] ));
    • 如果关闭GUC参数enable_functional_dependency,每组多列统计信息最多支持32列;如果开启GUC参数enable_functional_dependency,每组多列统计信息最多支持4列。
    • 不支持收集多列统计信息的表:系统表,全局临时表。
  • 自动收集多列统计信息。

    打开auto_statistic_ext_columns参数后执行ANALYZE,自动根据该表的索引前缀创建多列统计信息,多列统计信息的列数不超过设置的auto_statistic_ext_columns值。

    例:表t存在索引(a,b,c,d),设置auto_statistic_ext_columns参数为4,则analyze t将创建关于(a,b)、(a,b,c)、(a,b,c,d)的多列统计信息。

    ANALYZE [ VERBOSE ] table_name;

参数说明

  • VERBOSE

    启用显示进度信息。

    如果指定了VERBOSE,ANALYZE发出进度信息,表明目前正在处理的表。各种有关表的统计信息也会打印出来。

  • table_name

    需要分析的特定表的表名(可能会带模式名),如果省略,将对数据库中的所有表(非外部表)进行分析。

    对于ANALYZE收集统计信息,目前仅支持行存表。

    取值范围:已有的表名。

  • column_name,column_1_name,column_2_name

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

    取值范围:已有的列名。

  • partition_name

    如果table为分区表,在关键字PARTITION后面指定分区名partition_name表示分析该分区表的统计信息。

    取值范围:表的某一个分区名。

示例

--- 创建表。

m_db=# CREATE TABLE customer_info
(
WR_RETURNED_DATE_SK       INTEGER                       ,
WR_RETURNED_TIME_SK       INTEGER                       ,
WR_ITEM_SK                INTEGER               NOT NULL,
WR_REFUNDED_CUSTOMER_SK   INTEGER
);

--- 创建分区表。

m_db=# CREATE TABLE customer_par
(
WR_RETURNED_DATE_SK       INTEGER                       ,
WR_RETURNED_TIME_SK       INTEGER                       ,
WR_ITEM_SK                INTEGER               NOT NULL,
WR_REFUNDED_CUSTOMER_SK   INTEGER
)
PARTITION BY RANGE(WR_RETURNED_DATE_SK)
(
PARTITION P1 VALUES LESS THAN(2452275),
PARTITION P2 VALUES LESS THAN(2452640),
PARTITION P3 VALUES LESS THAN(2453000),
PARTITION P4 VALUES LESS THAN(MAXVALUE)
);

--- 使用ANALYZE语句更新统计信息。

m_db=# ANALYZE customer_info;
m_db=# ANALYZE customer_par;

--- 使用ANALYZE VERBOSE语句更新统计信息,并输出表的相关信息。

m_db=# ANALYZE VERBOSE customer_info;
INFO:  analyzing "public.customer_info"(cn_5002 pid=53078)
INFO:  analyzing "public.customer_info" inheritance tree(cn_5002 pid=53078)
ANALYZE

环境若有故障,需查看数据库主节点的log。

--- 删除表。

m_db=# DROP TABLE customer_info;
m_db=# DROP TABLE customer_par;

相关文档