更新时间:2024-11-12 GMT+08:00
分享

ANALYZE | ANALYSE

功能描述

  • 用于收集与数据库中普通表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC、PG_STATISTIC_EXT下,执行ANALYZE命令后,可在上述系统表中查询收集到的统计信息,也可以通过系统视图PG_STATS、PG_EXT_STATS查询信息。执行计划生成器会使用这些统计数据,以确定最有效的执行计划。
  • 如果ANALYZE没有指定参数,会分析当前数据库中的每个表和分区表。同时也可以通过指定table_name、column_name和partition_name参数把分析限定在特定的表、列或分区表中。
  • ANALYZE|ANALYSE VERIFY可用于检测数据库中普通表的数据文件是否损坏。
  • 每次收集的统计信息,都会存入统计信息历史表(GS_STATISTIC_HISTORYGS_STATISTIC_EXT_HISTORYGS_TABLESTATS_HISTORY)中,历史表存放的数量和统计信息的保留时间由GUC参数stats_history_record_limit和stats_history_retention_time控制。

注意事项

  • ANALYZE非临时表不支持在一个匿名块、事务块、函数或存储过程内被执行。ANALYZE临时表支持在存储过程中被执行,不支持统计信息回滚操作。
  • ANALYZE VERIFY如果不涉及远程读场景,远程读参数则不会生效。对于检测出关键系统表页面损坏的错误,将直接报错不再继续检测。
  • 如果ANALYZE不指定参数,则默认处理当前用户拥有相应权限的表。如果参数中指定了一个表参数,ANALYZE只处理指定的表。
  • 要对一个表进行ANALYZE操作,用户必须是表的所有者或者被授予了指定表VACUUM权限,三权分立开关关闭时,默认系统管理员有该权限。数据库的所有者允许对数据库中除了共享目录以外的所有表进行ANALYZE操作(该限制意味着只有系统管理员才能真正对一个数据库进行ANALYZE操作)。ANALYZE会跳过那些用户没有权限的表。
  • ANALYZE不收集无法做比较或等值运算的列,例如:CURSOR类型。
  • 如果拟分析的表成了一个空表,ANALYZE不会记录该表的统计信息,而原来已有统计信息则会保留。

语法格式

  • 收集表的统计信息。
    { ANALYZE | ANALYSE } [ VERBOSE ]
        [ table_name [ ( column_name [, ...] ) ] ] [ WITH PARTITION_MODE ];
  • 收集分区表的分区统计信息。
    { ANALYZE | ANALYSE } [ VERBOSE ]
        table_name [ ( column_name [, ...] ) ] { SUBPARTITION | PARTITION } ( partition_name ) ;

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

  • 手动收集多列统计信息。
    { ANALYZE | ANALYSE } [ VERBOSE ]
        table_name (( column_1_name, column_2_name [, ...] )) [ WITH partition_mode ];
    • 如果关闭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 | ANALYSE } [ VERBOSE ] table_name [ WITH partition_mode ];
  • 检测当前库的数据文件。
    { ANALYZE | ANALYSE } VERIFY { FAST | COMPLETE };
    • Fast模式校验时,需要对校验的表有并发的DML操作,会导致校验过程中有误报的问题,因为当前Fast模式是直接从磁盘上读取,有其他线程并发修改文件时,会导致获取的数据不准确,建议离线操作。
    • 支持对全库进行操作,由于涉及的表较多,建议以重定向保存结果。
      gsql -d database -p port -f sqlfile> sqllog.txt  2>&1
    • 只有对外可见的表对外提示NOTICE,内部表的检测会包含在它所依赖的外部表,不对外显示。
    • 此命令的处理可容错ERROR级别的处理。
    • 对于全库操作,当关键系统表出现损坏则直接报错,不再继续执行。
  • 检测表和索引的数据文件。
    { ANALYZE | ANALYSE } VERIFY { FAST | COMPLETE } { table_name | index_name } [CASCADE];
    • 支持对普通表的操作和索引表的操作,但不支持对索引表index使用CASCADE操作。原因是由于CASCADE模式用于处理主表的所有索引表,当单独对索引表进行检测时,无需使用CASCADE模式。
    • 对于主表的检测会同步检测主表的内部表,例如toast表等。
    • 当提示索引表损坏时,建议使用reindex命令进行重建索引操作。
  • 检测表分区的数据文件。
    { ANALYZE | ANALYSE } VERIFY { FAST | COMPLETE } table_name PARTITION (partition_name) [CASCADE];
    • 支持对表的单独分区进行检测操作,但不支持对索引表index使用CASCADE操作。
    • 不支持临时表和unlog表。

参数说明

  • VERBOSE

    启用显示进度信息。

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

  • table_name

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

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

    取值范围:已有的表名。

  • column_name,column_1_name,column_2_name

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

    取值范围:已有的列名。

  • partition_name

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

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

  • index_name

    需要分析的特定索引表的表名(可能会带模式名)。

    取值范围:已有的表名。

  • FAST|COMPLETE

    对于行存表,FAST模式下主要对于行存表的CRC和page header进行校验,如果校验失败则会告警; 而COMPLETE模式下,则主要对行存表的指针、tuple进行解析校验。

  • CASCADE

    CASCADE模式下会对当前表的所有索引进行检测处理。

  • PARTITION_MODE

    PARTITION_MODE适用于分区表级联收集统计信息,可选项和含义如下表所示。不适用于非分区表。

    表1 PARTITION_MODE选项说明

    PARTITION_MODE选项

    含义

    ALL

    收集整表、一级分区、二级分区的统计信息。

    GLOBAL

    收集整表的统计信息。

    PARTITION

    收集一级分区的统计信息。

    GLOBAL AND PARTITION

    收集整表、一级分区的统计信息。

    SUBPARTITION

    收集二级分区的统计信息。

    ALL COMPLETE

    收集整表、一级分区、二级分区的统计信息。

    AUTO

    缺省值,以statistic_granularity或default_statistic_granularity中配置的参数为准,其中表级参数statistic_granularity的优先级高于全局参数default_statistic_granularity。

    ALL和ALL COMPLETE的区别为:ALL_COMPLETE模式下,采用更高的采样率,相应地,计算统计信息的耗时更长。

    • 从505.0.0之前版本升级到505.0.0及更高版本时,在升级观察期期间,PARTITION_MODE不生效,其行为与升级前版本保持一致。
    • analyze整库时,不支持指定partition mode,即不支持analyze with global等语法。
    • analyze整库时,支持设置default_statistic_granularity为GLOBAL或ALL,此时analyze行为和default_statistic_granularity的定义相同;当default_statistic_granularity设置为其他值时,analyze行为退化为GLOBAL行为。

示例

  • 收集表的的统计信息。
    --创建customer_info表。
    gaussdb=# 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 );
    
    --使用ANALYZE语句更新统计信息。
    gaussdb=# ANALYZE customer_info;
    
    --使用ANALYZE VERBOSE语句更新统计信息,并输出customer_info表的相关信息。
    gaussdb=# ANALYZE VERBOSE customer_info;
    INFO:  analyzing "public.customer_info"(datanode pid=38661)
    INFO:  ANALYZE INFO : estimate total rows of "customer_info": scanned 0 pages of total 0 pages with 1 retry times, containing 0 live rows and 0 dead rows,  estimated 0 total rows(datanode pid=38661)
    INFO:  ANALYZE INFO : "customer_info": scanned 0 of 0 pages, containing 0 live rows and 0 dead rows; 0 rows in sample, 0 estimated total rows(datanode pid=38661)
    
    --使用ANALYZE VERBOSE输出customer_info表的wr_returned_time_sk列信息。
    gaussdb=# ANALYZE VERBOSE customer_info(wr_returned_time_sk);
    INFO:  analyzing "public.customer_info"(datanode pid=38661)
    INFO:  ANALYZE INFO : estimate total rows of "customer_info": scanned 0 pages of total 0 pages with 1 retry times, containing 0 live rows and 0 dead rows,  estimated 0 total rows(datanode pid=38661)
    INFO:  ANALYZE INFO : "customer_info": scanned 0 of 0 pages, containing 0 live rows and 0 dead rows; 0 rows in sample, 0 estimated total rows(datanode pid=38661)
  • 收集分区表的统计信息。
    --创建分区表。
    gaussdb=# CREATE TABLE customer_par( 
    wr_returned_date_sk INTEGER ,
    wr_returned_time_sk INTEGER ,
    wr_item_sk INTEGER NOT NULL,
    wr_returned_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))ENABLE ROW MOVEMENT;
    
    --使用ANALYZE语句更新统计信息。
    gaussdb=# ANALYZE customer_par;
    
    --使用ANALYZE VERBOSE输出customer_par表的相关信息。
    gaussdb=# ANALYZE VERBOSE customer_par;
    INFO:  analyzing "public.customer_par"(datanode pid=38661)
    --使用ANALYZE VERBOSE输出P1一级分区表的相关信息。
    gaussdb=# ANALYZE VERBOSE customer_par PARTITION(P1);
    INFO:  analyzing "public.customer_par"(datanode pid=38661)
  • 手动收集多列统计信息。
    --手动收集wr_returned_date_sk、wr_returned_time_sk这两列的统计信息。
    gaussdb=# ANALYZE VERBOSE customer_info (wr_returned_date_sk,wr_returned_time_sk);
    INFO:  analyzing "public.customer_info"(datanode pid=38661)
    INFO:  ANALYZE INFO : estimate total rows of "customer_info": scanned 0 pages of total 0 pages with 1 retry times, containing 0 live rows and 0 dead rows,  estimated 0 total rows(datanode pid=38661)
    INFO:  ANALYZE INFO : "customer_info": scanned 0 of 0 pages, containing 0 live rows and 0 dead rows; 0 rows in sample, 0 estimated total rows(datanode pid=38661)
  • 自动收集多列统计信息。
    --给customer_info表创建索引。
    gaussdb=# CREATE INDEX customer_index ON customer_info USING btree(wr_returned_date_sk,wr_returned_time_sk,wr_item_sk,wr_refunded_customer_sk);
    
    --设置auto_statistic_ext_columns参数为4
    gaussdb=# set auto_statistic_ext_columns=4;
    
    --自动收集多列统计信息。
    gaussdb=# ANALYZE VERBOSE customer_info;
    INFO:  analyzing "public.customer_info"(datanode pid=38661)
    INFO:  ANALYZE INFO : estimate total rows of "customer_info": scanned 0 pages of total 0 pages with 1 retry times, containing 0 live rows and 0 dead rows,  estimated 0 total rows(datanode pid=38661)
    INFO:  ANALYZE INFO : "customer_info": scanned 0 of 0 pages, containing 0 live rows and 0 dead rows; 0 rows in sample, 0 estimated total rows(datanode pid=38661)
  • 检测当前库的数据文件。
    gaussdb=# ANALYZE VERIFY FAST;
  • 检测表和索引的数据文件。
    --检查customer_info表。
    gaussdb=# ANALYZE VERIFY FAST customer_info;
    
    --检查customer_index索引。
    gaussdb=# ANALYZE VERIFY FAST customer_index;
    
  • 检测表分区的数据文件。
    --检查customer_par分区表中的P1分区。
    gaussdb=# ANALYZE VERIFY FAST customer_par PARTITION (P1);
  • 删除数据。
    --删除索引customer_index。
    gaussdb=# DROP INDEX customer_index;
    
    --删除表customer_info。
    gaussdb=# DROP TABLE customer_info;
    
    --删除分区表customer_par。
    gaussdb=# DROP TABLE customer_par; 
    

相关文档