数据驱动基数估计:DeepDB: Learn from Data, not from Queries!

面对大规模数据和不同的应用场景,传统数据库组件存在业务类型不敏感、查询优化能力弱等问题。因此,目前一类研究通过将传统数据库组件用机器学习算法替代,来实现更高的查询和存储效率。

主导的学习组件,是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后的结果表。
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值