摘要
随着基于位置的服务(LBS)的普及,空间数据处理在数据库系统管理的研究中受到了广泛的关注。在各种空间查询技术中,索引结构在数据访问和查询处理中起着关键作用。然而,现有的空间索引结构(例如,R-tree)主要集中于对数据空间(Space)或数据对象(Object)进行划分(Partition)。在本文中,我们探索了通过学习数据分布(Distribution)来构建空间索引结构的潜力。我们设计了一种新的数据驱动的空间索引结构,即 Learned Z-order Model(ZM)索引,它结合了 Z-order 空间填充曲线和多阶段*(Staged)学习模型。在真实数据集和合成数据集上的实验结果表明,在大多数情况下,我们的学习索引显著降低了内存开销,并且比 R-tree 执行效率更高。
基于空间索引如何做范围查询(Range Query)?
- 访问索引的根节点
- 递归地检索所有和指定范围相交的孩子节点
作者对于传统索引结构的评价
However, these approaches do not leverage the distribution patterns of data objects to get a denser index representation.
My Review
简单来说,学习索引的优势在于两处:
- 内存开销大幅降低
- 基于训练好的模型做查询,性能提升明显,可能有70%
这篇文章应该是 well written,也没有 overclaim 学习索引的各种奇妙能力。作者脚踏实地地用 Z-order 空间填充曲线来排序空间数据,再以 RMI 方式训练。基于该模型执行 range query,主要看点在于 biased_search
和 predict
这两个方法是具体怎么设计的,以及看一个完整的 workflow,对于我巩固此方面的调研,并且作为 baseline 都有借鉴意义。
Z-order
我在【SIGSPATIAL '20】A Tutorial on Learned Multi-dimensional Indexes 也提到,将学习模型应用到多维度数据上的一大挑战就是,多维的数据往往没有一个“总序”。试想一下,一维数据上的范围查询会有多简单呢,就是给定一个范围查找出对应区间的所有数据即可。而且学习模型也给出了针对这种需求的解决方案,就是我们着手这种问题的时候,首先会想到“二分查找”、再者数据库会想到“B+-tree”,那么敏感的机器学习研究者就会想到预测。结果可想而知,Learned Model 替代 Index 取得了非常强悍的效果,那么对于空间数据呢?
Z-order 空间填充曲线是很自然想到解决这个问题的方法。我也关注到 JUST(京东城市计算)有提出新的 XZ-order 技术,也会在后面调研的时候关注一下。
这一部分后面就主要介绍 Z-order 到底是什么?Z-order 和 Z-address 技术提出于 Integrating the UB-tree into a database system kernel( VLDB 2000)。简单概括他的思想就是通过画 “Z” 来提供一个空间数据的顺序,就像制定了一个规则,告诉大家什么是大,什么是小。
如果 Z-order 是一套规则告诉我们怎么排序,那么 Z-address 就是根据 Z-order 给每个网格(具体形态是什么不用太 care)赋一个独立整数。
Z-address 怎么计算?
Z-address 本质是保证单调性(Monotonic)。
范围查询,简单来说就是给定一个矩形(rectangle),这个矩形怎么表述呢?就是两个点,这两个点是两个对角点,这样一个范围就被框定了。和图里那个框框一样,但是在实现的时候实际上只要指定两个点就代表一个范围了。在空间数据库里可能是个矩形,在普通多维数据查询的时候很可能就是用 where 框定的一系列过滤条件。这里也可以顺便理解一下,为什么要那么多维度,我们不能以可视化的思维去思考这个问题。比如你想找一个薪水大于 100 万、年龄小于 30 且身高大于 180 的男生,实际上就是 4-D 数据查询了。(我总是偏题..
1)编码步骤
将空间递归分解成为更小的四个子空间,直到到达最大递归层级,分解过程中得到的四个子空间采用类似字母Z的顺序依次从0编码到3。所有的空间点都将被其所在最底层子空间的编码表示。如下图中空间点 p1
和 p2
都被 333
表示,p3
被 331
表示。
2)本文中是如何描述 Z-address 计算的
模型
由很多个线性模型或 NN 组成,每层模型的损失函数定义:
模型将按下面这个公式递归地构建起来:
叶子模型(这里我随意称呼它为这个)输出的位置可能不准,但是可以保证误差,如果叶子模型的输出为 position
,我们认为真正的 key 位置在 position − min error
和 position + max error
,利用二分查找走完最后一公里。
这篇文章用的基本模型是带有一个全连接隐层的前向神经网络,激活函数是 ReLU。
理论分析
B-tree:时间复杂度 O(log n)、空间复杂度 O(n)
R-tree:时间复杂度 O(log_M N)、空间复杂度 O(N)
learned ZM Model:均是 O(hw),h 和 w 就是假设有两个隐层,这两个隐层分别有 h 和 w 个神经元。
具有更多层(作者认为决策树的层级为 stage,layer 为另一种层,这里就是统一描述一下,实际上都包括)的模型将开销更大,但我们可以手动设置这些参数。换句话说,如果我们的模型能够学习 Z-address 的极其简单且精确的分布,我们可以实现常数级的查找时间和内存开销。例如,如果 Z-address 的分布是线性的,我们的模型将变成一个简单的线性模型,其搜索时间和内存大小是恒定的。
基于 learned ZM index 如何做查询?或者说查询处理流程是什么?
一、High-level 流程
- 构建 learned ZM index ;
- 基于 learned ZM index 执行范围查询。
二、具体查询实现细节
在该模型应用后,可以看到这个范围处理的流程是非常简单的,如下:
1)把数据集读入内存,初始化查询返回集;
2)计算整个数据集中的 min
和 max
(根据 Z-address 值),即 z_start
和 z_end
;
3)计算一个学习出来的范围,以 pos_start
和 pos_end
表征,我们认定结果一定在这个范围内,从而做到过滤大部分非候选键值的效果;
4)在 pos_start
和 pos_end
范围内的数据,若满足查询要求,则加入结果集;
5)返回结果集。
实验效果简述
作者拿 R-tree 和 learned ZM index 对比,主要从三个方面:1)内存开销;2)点查询;3)范围查询。
一、内存开销
learned ZM index 比 R-tree 降低 94% 内存开销,作者给出的解释是他们的神经网络模型很简单,参数很少,所以内存开销低这么多理所当然。
二、点查询
随机选取 10000 个点,查询速度上 learned ZM index 是 R-tree 的 2.3 - 2.5 倍。作者给出的解释就是,在复杂结构上检索远不如简单预测来得快。
三、范围查询
设置查询度从 0.0001
到 0.1
,当查询度比较低的时候,learned ZM index 比 R-tree 快 40%;当查询度很高的时候( 0.1
的时候),learned ZM index 比 R-tree 慢 5%。
对于比 R-tree 慢的现象,作者给的解释是,数据集本身的分布特性难以捕捉,再加上返回结果的时候需要将 Z-address 解码回 2D 数据点形态,都需要消耗时间,所以当我们需要查询到的结果集特别大的时候,性能开销都会增大。
作者在另一个数据集上也做了这个实验,learned ZM index 不管查询度为多少,都取得更好的效果,应该是代表这个数据集的分布更容易学习到吧。