技术原理
核心机制
- 模型创建
本功能由用户提交ANALYZE命令或者auto-analyze触发,通过CN样本采集器获取内存中数据样本结构并且包装成数据源结构体。如下图1所示,数据源结构体包含两部分信息,一部分是可能存在的高频值统计信息,另一部分是全量数据样本信息。高频值信息包含频度大于1的值(如果等于1,则不认为是高频值),而全量样本信息则是压平为序列一条一条发送给模型。因此模型可以通过获取到的频度判断当前读到的数据是高频值或者是普通样本数据。对于高频值统计数据,模型算子直接将其序列化保存到模型中,而对于普通样本数据,则对其不属于高频值的部分做贝叶斯网络模型统计。
- 模型推理
在基数估计阶段,系统首先将模型从磁盘读到内存中,然后将模型进行反序列化成为内存结构并且使用独立内存上下文进行缓存。如下图2所示,对于每条多列等值查询,首先查找高频值哈希表,如果找到则直接返回选择率P1(t),否则计算查询条件在贝叶斯网络模型中的选择率P2(t),最后返回P2(t) / (1.0-SUM(P1)),其中SUM(P1)是所有高频值选择率的和。使用本功能后,GaussDB中的多列等值选择率估计优先级为,有高频值优先从高频值哈希表中获取,非高频值通过贝叶斯网络获得选择率,如果上述模型都未创建或者覆盖,则尝试使用多列NDV进行估计,如果统计信息和查询列未匹配,那么采用多列函数依赖。如果上述统计信息均未创建,则将clause条件加回不匹配条件中,然后使用单列+独立性假设的方式估计。
- 模型信息显示
调用系统函数gs_ai_stats_explain(relid, stakeys),其中参数relid为整型, stakeys为数组。该系统函数获得输入参数后会和系统表pg_statistic_ext中的统计信息进行匹配,查找类型为BAYESNET类型的统计信息行,如果找不到,直接反馈失败;否则调用相应的模型解释框架函数,即贝叶斯网络的explain函数,从磁盘中读取模型,反序列化之后将信息重新组合成可读类型,构建成数组返回给系统函数。其中主要包含的内容有贝叶斯网络拓扑、高频值及其选择率、单列上的分桶类型、直方图或者MCV边界值、每个分桶中每个可能值的概率值。其余还包括一些模型通用信息,比如模型训练时间、模型超参数、模型创建时间等。
性能指标
- 高倾斜相关性数据上多列等值查询准确率和涉及索引选择的典型场景端到端性能有效提升。
- TPC-C等场景无劣化。
接口介绍
| 函数名 | 函数说明 |
| gs_ai_stats_explain | 打印对应表和列上的多列智能统计信息。 |

