【MDM '19】Learned Index for Spatial Queries

摘要

随着基于位置的服务(LBS)的普及,空间数据处理在数据库系统管理的研究中受到了广泛的关注。在各种空间查询技术中,索引结构在数据访问和查询处理中起着关键作用。然而,现有的空间索引结构(例如,R-tree)主要集中于对数据空间(Space)或数据对象(Object)进行划分(Partition)。在本文中,我们探索了通过学习数据分布(Distribution)来构建空间索引结构的潜力。我们设计了一种新的数据驱动的空间索引结构,即 Learned Z-order Model(ZM)索引,它结合了 Z-order 空间填充曲线和多阶段*(Staged)学习模型。在真实数据集和合成数据集上的实验结果表明,在大多数情况下,我们的学习索引显著降低了内存开销,并且比 R-tree 执行效率更高。

基于空间索引如何做范围查询(Range Query)?
  1. 访问索引的根节点
  2. 递归地检索所有和指定范围相交的孩子节点
作者对于传统索引结构的评价

However, these approaches do not leverage the distribution patterns of data objects to get a denser index representation.

My Review

简单来说,学习索引的优势在于两处:

  1. 内存开销大幅降低
  2. 基于训练好的模型做查询,性能提升明显,可能有70%

这篇文章应该是 well written,也没有 overclaim 学习索引的各种奇妙能力。作者脚踏实地地用 Z-order 空间填充曲线来排序空间数据,再以 RMI 方式训练。基于该模型执行 range query,主要看点在于 biased_searchpredict 这两个方法是具体怎么设计的,以及看一个完整的 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-order 和 Z-address 示例

Z-address 怎么计算?

Z-address 本质是保证单调性(Monotonic)

范围查询,简单来说就是给定一个矩形(rectangle),这个矩形怎么表述呢?就是两个点,这两个点是两个对角点,这样一个范围就被框定了。和图里那个框框一样,但是在实现的时候实际上只要指定两个点就代表一个范围了。在空间数据库里可能是个矩形,在普通多维数据查询的时候很可能就是用 where 框定的一系列过滤条件。这里也可以顺便理解一下,为什么要那么多维度,我们不能以可视化的思维去思考这个问题。比如你想找一个薪水大于 100 万、年龄小于 30 且身高大于 180 的男生,实际上就是 4-D 数据查询了。(我总是偏题..

1)编码步骤

将空间递归分解成为更小的四个子空间,直到到达最大递归层级,分解过程中得到的四个子空间采用类似字母Z的顺序依次从0编码到3。所有的空间点都将被其所在最底层子空间的编码表示。如下图中空间点 p1p2 都被 333 表示,p3331 表示。

Z-order 编码
2)本文中是如何描述 Z-address 计算的
Z-address 如何计算?

模型

由很多个线性模型或 NN 组成,每层模型的损失函数定义:

第 i 层模型损失函数

模型将按下面这个公式递归地构建起来:

叶子模型(这里我随意称呼它为这个)输出的位置可能不准,但是可以保证误差,如果叶子模型的输出为 position,我们认为真正的 key 位置在 position − min errorposition + 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 流程
  1. 构建 learned ZM index ;
  2. 基于 learned ZM index 执行范围查询。
二、具体查询实现细节
先占个位,后续写自己的理解

在该模型应用后,可以看到这个范围处理的流程是非常简单的,如下:
1)把数据集读入内存,初始化查询返回集;
2)计算整个数据集中的 minmax(根据 Z-address 值),即 z_startz_end
3)计算一个学习出来的范围,以 pos_startpos_end 表征,我们认定结果一定在这个范围内,从而做到过滤大部分非候选键值的效果;
4)在 pos_startpos_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.00010.1,当查询度比较低的时候,learned ZM index 比 R-tree 快 40%;当查询度很高的时候( 0.1 的时候),learned ZM index 比 R-tree 慢 5%。

对于比 R-tree 慢的现象,作者给的解释是,数据集本身的分布特性难以捕捉,再加上返回结果的时候需要将 Z-address 解码回 2D 数据点形态,都需要消耗时间,所以当我们需要查询到的结果集特别大的时候,性能开销都会增大。

作者在另一个数据集上也做了这个实验,learned ZM index 不管查询度为多少,都取得更好的效果,应该是代表这个数据集的分布更容易学习到吧。

你可能感兴趣的:(【MDM '19】Learned Index for Spatial Queries)