收集统计信息

最近更新时间:2026-06-30 16:45:31

我的收藏
对于只读分析实例而言,要使 SQL 执行获得良好性能,需要对表对象进行基础统计信息收集。完成统计信息收集后,系统才能够更精准地为用户执行的 SQL 推荐合理的执行计划。

统计信息概述

统计信息(Statistics)是关于数据库对象的数据特征和分布的信息。数据库可以利用统计信息计算出更准确的计划代价,优化执行计划的选择。统计信息的类型包含表的行数、列的不同值个数(Number of Distinct Values,简称 NDV)、列的直方图等信息。统计信息的收集涉及对数据库对象的扫描与获取,并将所收集的统计信息存储于系统的数据字典;此外,系统还会在本地维护统计信息的缓存,以提升优化器访问统计信息的效率。
在收集和使用统计信息时,需要注意以下两点:
统计信息的准确性对优化器的决策非常重要。因此,定期更新和维护统计信息是保持数据库性能的关键。
统计信息的收集可能会对数据库的性能产生一定的影响,因为它涉及对数据库对象的扫描和分析。因此,在收集统计信息时需要权衡性能和统计信息的准确性。
总之,统计信息在数据库管理系统中扮演着至关重要的角色,它们提供了关于数据库对象的关键信息,协助优化器作出更为明智的决策,进而提升查询性能及整体数据库系统的效能。
说明:
随机采样功能可以按照 TableScan 算子指定的采样率进行随机采样,并支持基于 Block 级别的采样,可根据设置的比例进行统计信息收集,能够极大地降低在收集统计信息过程中因全表扫描而产生的开销。

表的统计信息查询

通过 SHOW TABLE STATS 语句查询表的统计信息:
SHOW TABLE STATS [ShowLikeOrWhere];
查询结果字段说明如下:
列名
说明
Db_name
数据库名称。
Table_name
表名称。
Partition_name
分区名称。
Update_time
统计信息收集或更新时间。
Row_count
表的总行数。
Sample_size
收集基础统计信息时采样的行数。
Locked
该表的统计信息是否被锁定。
例如,查询 test 库中表 t1 的统计信息:
SHOW TABLE STATS WHERE Db_name='test' AND Table_name='t1';
说明:
SHOW TABLE STATS 外,只读分析实例还支持以下统计信息查询命令:
SHOW COLUMN STATS:查看列级统计信息。
SHOW INDEX STATS:查看索引统计信息。
SHOW HISTOGRAM STATS:查看直方图统计信息。
SHOW STATS HEALTHY:查看统计信息的健康度。
SHOW ANALYZE STATUS:查看正在执行的统计信息收集任务状态。
SHOW TABLE MODIFIED:查看表的修改情况(包括 Insert、Update、Delete 行数)。

统计信息收集

只读分析实例支持两种统计信息收集方式:自动收集和手动收集。

自动收集

只读分析实例内核支持在数据加载为列存时进行动态采样和统计信息自动收集的能力。用户无需手动收集即可生成对应库表的统计信息。
注意:
默认自动收集的统计信息不包含表的直方图信息。如需收集表的直方图信息,请使用手动收集方式。

手动收集

如需手动获取当前表的最新统计信息,可通过 MySQL 客户端登录至只读分析实例,执行以下语句收集指定表对象的统计信息:
ANALYZE TABLE <表名> [ALL COLUMNS | COLUMNS IdentList] [WITH <num> BUCKETS] [WITH <rate> SAMPLERATE];
参数说明:
参数
说明
ALL COLUMNS
指定所有列均按照默认行为收集统计信息。例如收集所有列的直方图。
COLUMNS IdentList
指定收集指定列的统计信息。例如 COLUMNS c1,c2,c3
WITH <num> BUCKETS
指定等高直方图或 TOPN 收集的桶个数,取值范围为 [1, 1024]。未指定时使用默认值 256。
WITH <rate> SAMPLERATE
指定采样率,单位为百分比,取值范围为 [0.000001, 100]。未指定时由系统根据数据量自动决定。
说明:
不指定 ALL COLUMNSCOLUMNS 子句时,使用默认收集策略,即收集列的基础统计信息,不包含直方图信息。
除上述子句外,还支持 INDEXPARTITIONUPDATE HISTOGRAM ON 等扩展子句。

使用示例

使用默认策略收集 test 库中 t1 表的统计信息:
ANALYZE TABLE t1;
收集 test 库中 t1 表所有列的直方图统计信息(256 个桶):
ANALYZE TABLE t1 ALL COLUMNS WITH 256 BUCKETS;
收集 test 库中 t1c1c2 列的直方图统计信息(256 个桶):
ANALYZE TABLE t1 COLUMNS c1,c2 WITH 256 BUCKETS;

数据库级别统计信息收集

当表的数量较多时,可对整个数据库进行统计信息收集。收集策略的含义与表级相同。收集原则是尽可能完成数据库下所有表的收集,单个表收集失败不会影响其他表的收集。
ANALYZE DATABASE DBNameList [ALL COLUMNS | COLUMNS IdentList] [WITH <num> BUCKETS] [WITH <rate> SAMPLERATE];
例如,对 test 库下所有表执行统计信息收集:
ANALYZE DATABASE test;

统计信息管理

只读分析实例还提供以下统计信息管理命令,用于精细化控制统计信息的生命周期。

删除统计信息

通过 DROP STATS 语句删除指定表的统计信息:
DROP STATS TableNameList;
例如,删除 test 库中 t1 表的统计信息:
DROP STATS test.t1;

锁定与解锁统计信息

通过 LOCK STATS 锁定指定表的统计信息,锁定后该表的统计信息不会被自动收集任务覆盖:
LOCK STATS TableNameList;
通过 UNLOCK STATS 解锁指定表的统计信息:
UNLOCK STATS TableNameList;
例如,锁定 test 库中 t1 表的统计信息:
LOCK STATS test.t1;