面对大规模数据和不同的应用场景,传统数据库组件存在业务类型不敏感、查询优化能力弱等问题。因此,目前一类研究通过将传统数据库组件用机器学习算法替代,来实现更高的查询和存储效率。
主导的学习组件,是query-based,workload-driven,以一堆有代表性的queryset去实际运行,产生训练集。这种方式的问题,在于训练成本很高,并且当workload变化时需要不断迭代。本文是采用另一种思路,data-driven,就是直接对于数据建模,并且模型可以同态的变化,接受insert,update,delete。
data-driven好处,和workload无关,你workload,查询变了,不会有影响,适用面也比较广,但是问题在于数据如果很大这个成本也是非常的高。
不同于Workload-driven的机器学习模型需要大量查询语句进行训练,Benjamin提出利用机器学习拟合关系型数据的数据分布情况,并可以基于这个模型进行基数估计、连接顺序选择等。和Naru动机相似,他们设计了一个Sum-Product Network(SPN)学习所有列(X1,X2,…,Xn)的联合概率分布。但不同于AR模型,SPN采用了一个树形结构:每个中间节点对应sum操作,将整个数据表分成两个数据组;每个叶子节点代表数据组中某一列的数据分布,用直方图表示,假设节点之间独立分布,同组的叶子节点间用product操作表示。对于范围查询,SPN直接改变对应叶子节点的范围,自底向上计算出根节点的选择度;对于join查询,他们先过滤掉不能被join的数据行,然后用product操作计算join列的选择度,可能存在较大的精度偏差。
其实本文的关键就是提出RSPN来表示数据。什么是PSPN?先看什么是SPN。SPN是network,但是出于简单的考虑,先看tree的结构。有两种节点,
一种是sum node,把数据进行聚类并进行划分,对于数据库就是把rows分成几块。
拿下面的例子看,就是把example table分成两部分,一块是30%,欧洲的老年人,一块是70%,亚洲的年轻人,但是这种划分不是绝对的,只是比例上。
一种是product node,把数据在独立的维度上进行投影,对于数据库就是独立的列。拿下面的例子看, 分成age和region两个维度。
叶子节点存放的是,每个维度的数据分布,可以用Histogram,linear function来表示。
如何生成SPN?
简单的说,对于sum node,就是聚类问题,可以用传统的KMeans。
对于product node,是相关性判断问题,需要找出独立的columns,为什么只有独立才能在product node分开,因为是要product,只有独立的column相乘才是合理的。
怎么用SPN?
直接看上面的例子,2d,欧洲,大于30岁的比例,这就是在算Cardinality
每个叶子节点得到相应filter的比例,然后后面在product node相乘,在sum node,加权相加,最终得到结果。
RSPN就是对于SPN的扩展
主要体现在以下几点上,
a. 支持聚合值,avg,sum
如下图中,计算欧洲客户的平均年龄
b. 支持直接更新
c. 支持多表的数据表示
下图的例子,我们既可以用两个独立的RSPN来学习两个表,也可以用一个RSPN学习Full Outer Join后的表。
采用哪一种方式取决于两个表的相关性,如果相关性比较高,就需要采用ensemble RSPN学习Join后的结果表。