统计信息主要是描述数据库表和表上的索引相关信息,常见的有表行数(row count)、选择率(selectivity)、基数(cardinality)、页面数等,以及描述数据分布特征的MCV(高频非NULL值)、HISTOGRAM(直方图)等信息。
AntDB-M作为一个分布式内存数据库,有管理节点(MN),计算节点(CN)和数据节点(DN)三种节点类型,要求在不同的节点上执行sql时,具有相同的执行计划。同时为了提高执行计划的生成效率,希望在制定执行计划时,相关辅助数据都在本地获取,减少跨节点访问数据的网络开销。为此,我们设计了全局统计信息汇聚,来帮助AntDB-M快速制定出更加优化的执行计划。
下面通过构建一个只有两个数据分片的分布式集群,来展示AntDB-M的部分全局统计信息。
第一步:分别创建一张sharding表t1、single表t2和global表t3.
图1:建表
第二步:在每张表中插入相同的80条数据,以t1表为例:
图2:分别插入数据
第三步:通过查询命令来观察部分统计信息:
图3:数据节点1执行
图4:数据节点2执行
由图3和图4可知,sharding表t1有一半的数据在数据节点1,一半的数据在数据节点2;single表t2的全部数据都在数据节点1;global表t3在所有数据节点上都有全量数据。
图5:任意节点执行索引信息查询
图6:任意节点执行直方图信息查询
上面通过操作直观展现了部分统计信息的结果,下面我们来看看AntDB-M分布式集群内部是如何生成全局统计信息的。
全局统计信息(非直方图)汇聚原理:通过配置项antdb_info_stat_time设置节点每隔多长时间上报一次本地统计信息,只有DN的leader节点需要上报, 但是要分发给所有的CN、DN和MN, 方式如下。
(1)对于sharding表和single表,由所有的DN leader汇报给MN的leader(MN对比hash值判断全局汇总数据是否发生变化,是否需要返回给DN);
(2)对于global表,由所在的DN leader根据hash算法判断自己是否需要汇报;
(3)DN的leader将汇报得到的结果推送给DN的备,MN的leader主动推送汇总信息给MN的备和CN节点;
全局直方图信息生成原理:只有管理节点的主(MN leader)通过分布式采样,生成全局直方图信息,然后推送给其它所有节点。数据库运行过程中,MN leader每隔一定时间判断某张表某个字段的直方图信息是否需要更新,若需要更新,则重新进行全局采样(MN leader内部可多线程并发更新)。分布式数据库AntDB-M在对字段进行范围估算时,直接使用全局直方图信息来提高估算的准确率,同时减少rpc次数以提高执行效率。
全局直方图信息在各个节点上都会持久化存储,其它全局统计信息可通过参数配置是否需要持久化。平时使用的时候,这些统计信息都是从内存中获取。
个性化功能:除了进程内部的常驻线程进行扫描和汇报,AntDB-M还提供命令进行统计信息的手动更新和上报,用来在某些特定的场景下定位问题或者更快地更新全局统计信息。
图7:数据节点1执行更新和上报
图8:管理节点的主上执行更新全局直方图信息
全局统计信息的应用及优势:AntDB-M查询优化器是基于代价的优化(Cost-Based Optimization,简称CBO),根据全局统计信息和设置的全局执行参数估算每种执行方式的代价,计算不同访问路径、不同join方式下,各种执行计划的成本,最后选择一种执行代价最优的执行方式,最大限度的满足客户业务要求。
图9:AntDB-M基于全局统计信息的查询优化器
由于具备全局统计信息自动汇聚和全局直方图信息(给优化器提供更准确的数据分布,且会随着分布式数据的变动而动态更新),AntDB-M查询优化器在进行范围估算,索引选择上具有更高的准确性。同时,由于每个节点内存中有相关统计信息,在制定执行计划时不需要跨节点获取相关辅助信息,从而使得AntDB-M在复杂场景下具有更高的性能。
关于AntDB数据库
AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。