华为云云数据库GaussDBANALYZE | ANALYSE_云淘科技
功能描述
用于收集与数据库中普通表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC、PG_STATISTIC_EXT下,执行ANALYZE命令后,可在上述系统表或系统视图PG_STATS、PG_EXT_STATS内查询收集到的统计信息。执行计划生成器会使用这些统计数据,以确定最有效的执行计划。
如果没有指定参数,ANALYZE会分析当前数据库中的每个表和分区表。同时也可以通过指定table_name、column和partition_name参数把分析限定在特定的表、列或分区表中。
ANALYZE|ANALYSE VERIFY用于检测数据库中普通表(行存表、列存表)的数据文件是否损坏。
注意事项
ANALYZE非临时表不能在一个匿名块、事务块、函数或存储过程内被执行。支持存储过程中ANALYZE临时表,不支持统计信息回滚操作。
ANALYZE VERIFY操作处理的大多为异常场景检测需要使用RELEASE版本。ANALYZE VERIFY场景不触发远程读,因此远程读参数不生效。对于关键系统表出现错误被系统检测出页面损坏时,将直接报错不再继续检测。
如果没有参数,ANALYZE处理当前数据库里用户拥有相应权限的每个表。如果参数指定了一个表,ANALYZE只处理指定的那个表。
要对一个表进行ANALYZE操作,通常用户必须是表的所有者或者被授予了指定表VACUUM权限的用户,默认系统管理员有该权限。数据库的所有者允许对数据库中除了共享目录以外的所有表进行ANALYZE操作(该限制意味着只有系统管理员才能真正对一个数据库进行ANALYZE操作)。ANALYZE命令会跳过那些用户没有权限的表。
ANALYZE不收集无法做比较或等值运算的列,例如cursor类型。
语法格式
收集表的统计信息。
{ ANALYZE | ANALYSE } [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ];
收集分区表的分区统计信息,该语法在功能上尚不支持。
{ ANALYZE | ANALYSE } [ VERBOSE ] table_name [ ( column_name [, ...] ) ] PARTITION ( patrition_name ) ;
普通分区表目前支持针对某个分区的统计信息的语法,但功能上不支持针对某个分区的统计信息收集。
收集外表的统计信息。
{ ANALYZE | ANALYSE } [ VERBOSE ] { foreign_table_name | FOREIGN TABLES };
收集全局二级索引的统计信息。
{ ANALYZE | ANALYSE }GLOBAL INDEX index_name FOR TABLE table_name;
在对全局二级索引执行ANALYZE之前需要先对基表执行一次ANALYZE,以保证全局二级索引统计信息的准确性。
在对全局二级索引进行REINDEX/REBUILD类型操作之后,需要先对基表进行一次ANALYZE,然后才能对全局二级索引进行ANALYZE,以保证全局二级索引统计信息的准确性。
当前对全局二级索引进行统计信息收集必须指定index_name和table_name,且index_name必须是全局二级索引名。
全局二级索引统计信息仅包括pg_class系统表中的统计信息(reltuple和relpages)。
手动收集多列统计信息
{ ANALYZE | ANALYSE } [ VERBOSE ] table_name (( column_1_name, column_2_name [, ...] ));
每组多列统计信息最多支持32列。
不支持收集多列统计信息的表:系统表。
在逻辑集群(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)模式下,只有管理员用户可以对数据库中所有表执行analyze,关联逻辑集群的用户只会对逻辑集群范围的表收集统计信息。
自动收集多列统计信息。
打开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;
检测当前库的数据文件
{ ANALYZE | ANALYSE } VERIFY { FAST | COMPLETE };
Fast模式校验时,需要对校验的表有并发的DML操作,会导致校验过程中有误报的问题,因为当前Fast模式是直接从磁盘上读取,并发有其他线程修改文件时,会导致获取的数据不准确,建议离线操作。
支持对全库进行操作,由于涉及的表较多,建议以重定向保存结果gsql -d database -p port -f “verify.sql”> verify_warning.txt 2>&1。
不支持临时表和unlog表。
对外提示NOTICE只核对外可见的表,内部表的检测会包含在它所依赖的外部表,不对外显示和呈现。
此命令的处理可容错ERROR级别的处理。由于debug版本的Assert可能会导致core无法继续执行命令,建议在release模式下操作。
对于全库操作时,当关键系统表出现损坏则直接报错,不再继续执行。
检测表和索引的数据文件
{ ANALYZE | ANALYSE } VERIFY { FAST |COMPLETE } { table_name | index_name } [ CASCADE ];
支持对普通表的操作和索引表的操作,但不支持对索引表index使用CASCADE操作。原因是由于CASCADE模式用于处理主表的所有索引表,当单独对索引表进行检测时,无需使用CASCADE模式。
不支持临时表和unlog表。
对于主表的检测会同步检测主表的内部表,例如toast表、cudesc表等。
当提示索引表损坏时,建议使用reindex命令进行重建索引操作。
检测表分区的数据文件
{ ANALYZE | ANALYSE } VERIFY { FAST | COMPLETE } table_name PARTITION (patrition_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表示分析该分区表的统计信息。目前语法上支持分区表做ANALYZE,但功能实现上暂不支持对指定分区统计信息的分析。
取值范围:表的某一个分区名。
foreign_table_name
需要分析的特定表的表名(可能会带模式名)。
取值范围:已有的表名。
FOREIGN TABLES
分析所有当前用户权限下的外表。
index_name
需要分析的特定索引表的表名(可能会带模式名)。
取值范围:已有的表名。
FAST|COMPLETE
对于行存表,FAST模式下主要对于行存表的CRC和page header进行校验,如果校验失败则会告警; 而COMPLETE模式下,则主要对行存表的指针、tuple进行解析校验。 对于列存表,FAST模式下主要对于列存表的CRC和magic进行校验,如果校验失败则会告警; 而COMPLETE模式下,则主要对列存表的CU进行解析校验。
CASCADE
CASCADE模式下会对当前表的所有索引进行检测处理。
示例
— 创建表。
1 2 3 4 5 6 7 8 |
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 ) DISTRIBUTE BY HASH (WR_ITEM_SK); |
— 创建分区表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
gaussdb=# 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 ) DISTRIBUTE BY HASH (WR_ITEM_SK) 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语句更新统计信息。
1 |
gaussdb=# ANALYZE customer_info; |
— 使用ANALYZE VERBOSE语句更新统计信息,并输出表的相关信息。
1 2 3 4 5 |
gaussdb=# ANALYZE VERBOSE customer_info; INFO: analyzing "cstore.pg_delta_3394584009"(cn_5002 pid=53078) INFO: analyzing "public.customer_info"(cn_5002 pid=53078) INFO: analyzing "public.customer_info" inheritance tree(cn_5002 pid=53078) ANALYZE |
若环境若有故障,需查看CN的log。
— 删除表。
1 2 |
gaussdb=# DROP TABLE customer_info; gaussdb=# DROP TABLE customer_par; |
父主题: SQL语法
同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家