对于只读分析引擎而言,想要 SQL 执行结果好,则需要对表对象进行数据的基本统计信息收集。完成了统计信息收集的表,系统才会更精准的为用户执行的 SQL 进行合理的执行计划推荐。
统计信息概述
统计信息(Statistics)是关于数据库对象的数据特征和分布的信息。数据库可以利用统计信息来计算出更准确的计划代价,优化计划的选择。统计信息的类型包含表的行数、列的不同值个数(number of distinct,简称 NDV)、列的直方图等信息。统计信息的收集涉及对数据库对象的扫描与获取,并将所收集的统计信息存储于系统的数据字典,此外,系统还会在本地维护统计信息的缓存,以提升优化器访问统计信息的效率。同时,在收集使用统计信息时,需要注意以下两点:
统计信息的准确性对于优化器的决策非常重要。因此,定期更新和维护统计信息是保持数据库性能的关键。
统计信息的收集可能会对数据库的性能产生一定的影响,因为它涉及扫描和分析数据库对象。因此,在收集统计信息时需要权衡性能和统计信息的准确性。
总之,统计信息在数据库管理系统中扮演着至关重要的角色,它们提供了关于数据库对象的关键信息,协助优化器作出更为明智的决策,进而提升查询性能及整体数据库系统的效能。
说明:
在2.2410.1.0及之后的版本中支持了随机采样功能,该功能可以按照 TableScan 算子指定的采样率进行随机采样。同时可支持基于 Block 级别的采样,并且可以根据设置的比例进行统计信息收集,能够极大地降低在收集统计信息过程中因全表扫描而产生的开销。
表的统计信息查询
SHOW TABLE STATS [ShowLikeOrWhere];
查询结果字段说明如下:
列名 | 说明 |
db_name | 数据库的名字。 |
table_name | 表的名字。 |
partition_name | 分区的名字。 |
update_time | 收集更新时间。 |
modify_count | 表涉及修改的行数。 |
row_count | 表的总行数。 |
sample_size | 收集基础统计信息采样的行数。 |
查询 test 库中 t1 的表的统计信息如下示例:
SHOW TABLE STATS WHERE db_name='test' AND table_name='t1';
统计信息收集
目前只读分析引擎支持两种不同的统计信息收集方式:
自动收集
在2.2410.1.0及之后的版本中,只读分析引擎内核支持了根据数据加载为列存时进行动态采样和统计信息自动收集的能力。用户无需手动收集即可生成对应库表的统计信息。
注意:
默认自动收集统计信息不包含表的直方图信息,如需收集表的直方图信息,请进行手动收集。
手动收集
如果需要手动获取当前表的最新统计信息,可以手动通过 MySQL 客户端登录至只读分析引擎实例中,执行如下语句即可收集指定表对象的统计信息:
ANALYZE TABLE <表名> [ ALL COLUMNS| COLUMNS IdentList [WITH NUM BUCKETS]];
ALL COLUMNS 指定所有列都按照指定行为收集统计信息,比如指定所有列都收集直方图。
不指定 ALL COLUMNS,则使用默认收集策略,即收集列的基础统计信息,不包含直方图信息。
COLUMNS IdentList 代表需要收集指定列的相关统计信息。如
COLUMN c1,c2,c3
。NUM BUCKETS 指定等高直方图或者 TOPN 收集的桶个数,其中范围为[1,1024],其中指定桶个数为1则表示不收集等高直方图或者 TOPN。
使用示例
使用默认策略收集 test 库中 t1 的统计信息:
ANALYZE TABLE t1;
指定收集 test 库中 t1 的所有列的直方图统计信息:
ANALYZE TABLE t1 ALL COLUMNS WITH 256 BUCKETS;
指定收集 test 库中 t1 的 c1,c2列统计信息直方图:
ANALYZE TABLE t1 COLUMNS c1,c2 WITH 256 BUCKETS;
手动指定 database 级别的统计信息收集
如果表的数量较多时,可以直接对 database 进行统计信息收集。收集策略的含义同表级相同,收集原则是尽可能的将整个 database 下的表都收集完成,如果某个表收集失败,不会影响其他表的收集。
ANALYZE DATABASE DBNameList [ ALL COLUMNS| COLUMNS IdentList [WITH NUM BUCKETS]];