SIGMOD 全称是Special Interest Group on Management Of Data,是Database方向最顶级的会议,如果谁能够在其上发表一篇文章,毕业和找工作都是没有任何问题的,和VLDB,ICDE并称为数据库方向的三大顶级会议
空间数据库主要是存储空间信息的数据库,一般来说空间信息很难用关系数据库来进行存储,但是还是有很多的人在这方面进行了努力,专门设计了Spatial Database来进行处理空间信息。
Join操作是数据库操作中最常见的一种操作,它有这么几个特点,耗时,计算量大,当Join和Spatial DataBase结合在一起的时候,也就是Spatial Join这是一个很难解决的问题,Join在空间数据库中有distance Join,有intersection Join,还有满足一定条件的join等,以下解决的主要是intersection join,当然也可以比较方便的转入其他的join设置条件。当面对Spatial Join的问题的90年代,SIGMOD从93到97年有四篇关于Spatial Join的paper,这是关于解决Spatial Join的一个高峰期,等过了这段时间, 在SIGMOD上就没有关于Spatial Join的文章了,这四篇文章分别
1. "Efficient Processing of Spatial Joins using R-trees",T. Brinkhoff, H-P Kriegel and B. Seeger, Proc. SIGMOD, 1993
R-tree 是解决Spatial 数据库中最常用的index,而且到现在为止有很多的衍生品,如R*-tree,R+-tree等等,这篇文章的目的就是当时现有的访问方式而不是提出新的特殊的数据结构去解决Join问题,所以用R-tree解决空间数据库中的Join问题。
首先,有两个空间数据集R和S,两者都建立起R-index的索引
- a. 从root开始,如果两个node A和B相交的话,A中的所有的子节点和B的所有子节点做相交计算,如果不相交的话,两者的子节点不需要进行join操作,节省了计算的数目。使用递归的方式,当两个node是leaf node的时候,两者满足相交的条件,就输出结果,否则一直递归进行下去。
- b. 上述的算法有一个问题,就是如果node A和B相交的话,A中的所有的子节点都需要和B中的所有子节点进行比较,但是实际上只有那些和A和B相交区域有交集的子节点才会和另一个的子节点有交集,所以为了减少计算量,只是分别拿与A与B相交区域有交集的A和B的子节点进行比较
- c. b算法中还是有一些问题,如果A的某一个子节点只是和AB的相交区域有交集,但是和B中子节点没有交集,这样按照b中的算法还是需要进行比较的,所以作者想到一种可以减少比较次数的方式,就是使用Plane-Sweep算法来解决这个问题,首先对与AB相交区域有交集的所有节点按照某一个dimension(x)进行投影,并且排序,选取S和R中最小的一个,之后寻找与此在这个dimension上相交的所有的另一个集合中的子节点,之后比较另一个dimension,找出在各个dimension都相交的子节点,这样就得到了一组输出结果,如果这一组结果是页节点的话,直接输出最终结果,如果不是的话,递归,继续计算
- a. 对于每个子节点加入一个属性degree,记录与每个节点相交节点的个数,我们将有最大degree的子节点保存在buffer中,因为它有最大的概率在以后的计算中会被使用
- b. 首先计算两个node的所有子节点的相交区域,之后对相交区域按照中心点的z-order值进行排序,根据这些相交区域的排序顺序读取相对应节点,这样的话可以尽量减少读取的次数
2. “Spatial Joins using Seeded Trees”, M-L Lo and C. V. Ravishankar, Proc. SIGMOD, 1994.
这篇paper也是用R-tree来解决Spatial Join的问题,主要的思路是这样的,对于较小的集合建立R-tree,之后以这个R的上层结构为另一个数据集合建立集合,这样提高了做join的效率,对于只有一个集合的数据的节点,可以直接舍去,因为不会产生出结果。
整个算法分为三个阶段:
有两个空间数据集R和S,R建有R-tree的索引
Seeding Phase,复制R集合上的R-tree索引的上部的k level的树结构
Growing Phase,将S集合中的数据插入到复制来的tree结构中,如果没有位置,就舍弃
Clean-up phase,将那些空的节点删掉,那些节点代表着S集合中没有相对应位置的数据
这样通过在Growing中filter一部分S集合中的数据,还有在Clean-up中filter掉一些R集合的数据,之后对于相对应的位置在进行join操作,提高了效率。
3. “Spatial Hash-Joins”, M-L Lo and C. V. Ravishankar, Proc. SIGMOD, 1996
因为当做join的数据集比较大的时候,超出了内存的容量,需要将这些数据集分成小的块来能够加载到内存中进行处理。但是如何来切分才能保证结果的正确性是个难题,本文章通过hash的方式将大块分成小块,并且保证结果的正确性,在2010年的时候,有人用此方法在MapReduce架构下解决Spatial Join的问题。
做Spatial Hash Joins的前提是R和S数据集都没有index,整个算法包括两个阶段:Partition Phase和Join Phase
Join Phase:
4. “Size Separation Spatial Joins”, N. Koudas and K. C. Sevcik, Proc. SIGMOD, 1997.