《RDF-3X: a RISC-style Engine for RDF》

一、文章贡献

  1. RDF-3X提出了用于存储和索引RDF三元组的通用解决方案,完全消除了物理设计调优的需要

  2. 强大而简单的查询处理器,最大限度的利用快速合并连接

  3. 查询优化器,用于使用基于整个连接路径的统计概要的成本模型选择最佳连接顺序。

快速合并连接(Fast Merge Join)是一种数据库查询优化算法,用于高效地执行连接操作。连接操作是关系型数据库中常见的一种操作,它用于联合两个表或数据集的行,根据连接条件将它们的行组合在一起。合并连接是连接操作中的一种实现方式,而快速合并连接是为了提高连接操作的性能而设计的一种特定算法。

快速合并连接的主要思想包括以下步骤:

  1. 排序: 快速合并连接首先对连接参与的列进行排序。这可以通过对每个连接参与的列进行排序,或者通过使用已经有序的索引来实现。

  2. 扫描: 一旦连接参与的列有序,算法将同时扫描这两个有序的列。扫描是通过同时移动两个列的指针,逐个比较它们的元素来实现的。

  3. 匹配: 在扫描的过程中,如果两个列的当前元素匹配,就将它们合并到结果集中。如果元素不匹配,就根据大小关系移动指针,继续寻找匹配的元素。

  4. 重复此过程: 上述步骤将循环执行,直到两个列的末尾。这样,算法能够在相对较短的时间内找到匹配的元素,而不需要完全遍历整个数据集。

RDF是没有数据库模式的,一个模式可能会在长期运行中出现。

SPARQL也允许与模式无关的查询。

RDF-3X是针对大规模RDF数据的。

在单个巨型三元组表上创建适当的索引。在构成RDF三元组的三个维度的所有6个排列上建立索引。此外,还为所有三个二维和所有三个一维投影建立计数聚合变量的索引。这些索引中的每一个都可以很好的压缩,所有索引的总储存空间小于主数据的大小

查询处理器:依赖于排序索引列表上的合并连接来实现。查询处理器不能忽略由于对副本的影响而被投影的变量,但它不必创建显式绑定。只要我们能够保证产生正确数量的副本,绑定本身就不相关。我们稍后将通过计算重复的数量来使用这个观察结果,而不是产生重复本身。

查询优化器:在生成执行计划时主要关注连接顺序。

二、存储和索引

2.1、三元组存储和字典

使用单个可能巨大的三元组表来存储。将所有的三元组存储再一个(压缩的)聚类B+树种。三元组在B+树种按照字典顺序排序。这允许将SPARQL模式转换为范围扫描。

  1. 有序存储结构: 假设RDF数据以三元组的形式存储,并且这些三元组按照词典顺序有序排列,例如通过B+-树。

  2. 共同前缀: 在SPARQL模式中,literal1和literal2构成了一个共同的前缀。这意味着在存储结构中,这些三元组的主语和谓语的部分是有序的,并且有相同的前缀。

  3. 范围扫描: 通过在存储结构中进行范围扫描,可以在共同前缀的范围内快速找到满足条件的数据。范围扫描允许系统在一次遍历的过程中找到所有在这个范围内的匹配项,而不需要逐个检查每个数据项。

  4. 变量绑定: 在范围扫描的过程中,对于模式中的变量?x,可以找到所有满足模式的具体值。这是通过在共同前缀的范围内检索所有可能的?x的绑定实现的。

由于三元组可能包含长字符串文字,因此我们采用自然方法,使用映射字典将所有文字替换为ID。在查询转换期间,查询种出现的文字被转换为他们的字典id,这可以通过标准的B+树从字符串到ID来完成。

2.2、压缩索引

由于三元组是(主语S、谓词P、宾语O)的所有六种可能的排列,所以在六个单独的索引中维护了这六种可能的排列。由于排列不同,所以将其采用通用术语(value1,value2,value3)来代替,并且直接存储在B+树的叶页种。

排序顺序使得相同的三元组非常相似:大多数三元组在value1和value2种有相同的值,而value3的增量往往非常小。这样的特点导致我们可以存储三元组的变化而不是存储完整的三元组。且我们只在单个叶内应用压缩,而从不跨页应用。

如何压缩呢?压缩必须要解决空间节省和cpu压缩时间的权衡问题。所以在字节级别进行压缩。我们计算每个值的增量,然后使用最小的字节数来编码增量。头字节表示以下值使用的字节数。每个value需要0-4个字节。0字节表示未更改。这意味着每个value有物种可能的大小(0,1,2,3,4)个字节。三个value就是有555=125种可能的组合。报头payload有7位,最多可以表示1111111种组合,即127种。剩余的间隙位gap用于指示小间隙:当只有value3改变,并且delta小于128时,它可以直接包含在报头字节的有效载荷中。即写在payload中。

逐页压缩的特点:

  1. 允许我们查找到任何叶页,并直接开始阅读三元组。

  2. 压缩索引的行为就像一个普通的B+树,可以像在标准B+树中轻松完成更新。

  3. 可以采用先进的并发控制和恢复方法进行索引管理,而无需任何更改。

2.3、聚合索引

对于这样的查询语句,他要找到的是a和c,但是也必须找出所有与之相关的b才行。因此构建了聚合索引。每个索引只存储三元组中三列中的两列,以及聚合计数,即该对在三元组的全体中出现的次数。从而添加六个索引。所以?B不必出现在输出中,但是需要产生正确数量的重复项。

聚合索引存储的是(value1,value2,count).但除此之外,它们被组织在B+树中,就像完全三重压缩的索引一样。叶编码略有不同,因为现在大多数更改都涉及value 2中的间隙和低计数值。伪代码如图4所示。最后,除了这些针对三元组中的对的索引之外,我们还构建了所有三个只包含(value 1,count)项的单值索引(编码类似)。虽然只使用一个变量的三重模式可能很少见,但单值索引非常小,并且使用它们可以简化查询转换。

三、查询过程及优化

3.1、翻译SPARQL脚本

翻译SPQRQL查询的第一步是将其转换为适合后续优化的演算表示,演算为关系元组演算。即针对表中的行(元组)进行演算。元组演算更容易在以后进行优化。当一个查询由一个单一的三元组模式组成时,我们可以使用上一节中的索引结构,通过范围扫描来回答查询。当一个查询包含多个三元组模式时,我们必须连接各个模式的结果。因此,要对查询图采用连接排序算法。

每个三元组模式对应于查询图中的一个节点。从概念上讲,每个节点(查询)都需要扫描整个数据库,虽然这些扫描中的每一个都可以实现为单个索引范围扫描,但优化器可以选择不同的策略。当且仅当两个节点有一个共同的变量时,他们才是连接的。

3.2、优化连接排序(join)

执行计划的特定形式:他们将尽可能长时间的使用保持顺序的合并连接,并仅对最后几个操作符切换到散列连接。

我们的解决方案是基于自底向上的DP框架完成的。一共两步:

  1. 优化器分析查询:检查查询的其他部分使用了哪些变量绑定。如果一个变量未被使用,可以使用一个聚合索引被投射出去。

  2. 优化器决定使用哪个使用的索引。有两个因素影响索引的选择:

    1. 当三元组模式中的文字构成索引键的前缀时,会被范围扫描自动处理。否则会读取太多元组,需要额外的选择。

    2. 不同的索引可能会按照适合于随后的合并连接的顺序产生三元组。因此优化器为所有索引生成计划,并使用计划修剪机制来决定是否可以尽早丢弃其中的一些计划。

      1. 修剪主要基于估计的执行成本来完成。优化器为每隔生成的计划调用成本模型,并删除由更偏稀的替代方案主导的等效计划。---》选择代价更小的计划

    从种子开始,通过连接较小问题的最佳解决方案来创建较大的计划。

3.3、处理析取查询

Optional和Union都是析取。在优化过程中,我们将Union和Optional中的模式组视为嵌套的子查询。也就是说,首先优化嵌套模式组,然后在优化外部查询时,将他们视为具有特殊成本/基数的基本关系。

  1. 对于Union,我们添加模式组的结果的联合,就好像他们是一个基本关系

  2. 对于Optional,使用外部连接将结果添加为基本关系。

3.4、保留结果基数

扫描未聚合的索引,多重性总是未1,聚合索引将count报告为多重性。连接操作符将多重性相乘以获得每个输出元组的重复数。

四、选择性估计

查询优化器依靠其成本模型来查找成本最低的执行计划。特别是,估计的基数(以及选择性)对计划生成有巨大的影响。本文提出了两种统计方法。

  1. 第一个是专用直方图,他是通用的,可以处理任何类型的三重模式和连接。缺点是,假设谓词之间的独立性,这在紧密耦合的三重模式中通常不成立

  2. 第二个统计信息计算数据中的频繁连接路径,并对这些路径进行更准确的预测。

在查询优化过程中,我们使用连接路径基数(如果可以),否则假设独立性并使用直方图。

4.1、选择性直方图

虽然三元组在概念上形成了一个具有三列的表,但各个列上的直方图并不是很有用,因为大多数查询模式至少设计三元组的两个属性。所以本文构建了六个不同的统计数据,每个统计数据对应于三元组中条目的每一个顺序。从聚合索引开始,我们将所有具有长度为2的相同前缀的三元组放在一个桶中,然后合并最小的两个相邻桶,知道总直方图足够小。

对于每个桶,统计以下信息

如果桶中的三元组根据指定的连接条件连接到数据库中的所有其他三元组,则返回结果基数

4.2、频繁路径

出现频率高的路径被认为更有可选择性。

上面讨论的直方图的一个缺点是假设谓词之间是独立的。在sparql查询中,通常会出现两种相关的谓词。

  1. 星形:其中具有不同谓词的多个三重模式共享一个主语。这些用于选择特定的主体

  2. 三重模式的链,其中第一个模式的宾语是下一个模式的主语,同样具有给定的谓词。

这两种情况都很常见,我们还构建了专门的统计数据,以便提供更准确地估计。

星星路径的定义类似,p1,...,pn在这种情况下是未排序的。我们计算最频繁的路径,即,具有最大基数的路径,并具体化它们的结果基数和路径描述P1,...,pn.使用这些信息,我们可以准确地预测查询中出现的频繁路径的连接基数。

4.3、复合路径

为了估计整个复合查询的总体选择性,我们将直方图与频繁路径统计相结合。使用频繁路径统计来估计两个连接子链的选择性,以及选择的直方图。然后,在没有任何其他统计量的情况下,我们假设不同的估计量是概率独立的,从而得到一个乘积公式,其中每个子链和每个选择的估计量作为因子。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值