索引数据输入的备选方案1

时间:2017-06-13 09:51:20

标签: database indexing data-structures file-organization

在索引中存储为数据条目的三种备选方案之一是数据条目 k * ,它是具有搜索键值 k 的实际记录。我的问题是,如果你要将实际记录存储在索引中,那么创建索引的重点是什么?

1 个答案:

答案 0 :(得分:1)

  

这是一个极端的情况,因为它并不真正对应   数据条目由数据记录分隔(散列文件是   这种情况的例子)。

(M.Lenzerini,R。Rosati, Database Management Systems: Access file manager and query evaluation ,“La Sapienza”罗马大学,2016年)

备选方案1通常用于直接索引,例如在B树和哈希索引中(另请参阅Oracle, Building Domain Indexes

我们来做一个具体的例子。

我们有一个关系R(a,b,c),我们有一个聚集 B + ⁠-⁠tree使用搜索键a上的替代2。由于树是聚类的,因此关系R必须按a排序。

现在,让我们假设关系的常见查询是:

SELECT *
FROM R
WHERE b > 25

所以我们想要构建另一个索引来有效地支持这种查询。

案例1:使用alt的群集树。 2

我们知道集群 B + ⁠-⁠备用2的备注对于范围查询是有效的,因为它们只需要搜索第一个好结果(比如说一个b=25),然后对该结果指向的关系页面进行1页访问,最后扫描该页面(最终扫描其他页面),直到记录落在给定范围内。

总结一下:

  • 在树中搜索第一个好结果。 费用:log ƒ(ℓ)
  • 使用找到的指针转到特定页面。 费用:1
  • 扫描页面和最终的其他页面。 费用:num。相关页面

最终费用(以页面访问量表示)是

log ƒ(ℓ)+ 1 + #relevant-pages

其中ƒ是扇出,是叶数。

不幸的是,在我们的例子中,搜索键b上的树必须是非聚集的,因为关系已经按a排序

案例2:使用alt的非聚集树。 2(或3)

我们也知道B + ⁠-⁠tree在 unclustered 时在范围查询中效率不高。事实上,在树中有一个替代2或3的树,我们只存储指向记录的指针,因此对于落在范围内的每个结果,我们必须对可能不同的页面进行页面访问(因为关系与索引的顺序不同。

总结一下:

  • 在树中搜索第一个好结果。 费用:log ƒ(ℓ)
  • 跟踪扫描叶子(可能还有其他叶子),并为属于该范围的每个元组执行不同的页面访问。 费用:num。其他相关的叶子+数量。相关元组

最终费用(以页面访问量表示)是

log ƒ(ℓ)+#other-relevant-leaves + #levant-tuples

请注意,元组的数量相对于页数非常更大

案例3:带有alt的非聚集树。 1

使用替代方法1,我们拥有树中的所有数据,因此为了执行查询,我们:

  • 在树中搜索第一个好结果。 费用:log ƒ(ℓ)
  • 跟踪扫描叶子(也许是其他叶子)。 费用:num。其他相关的叶子

最终费用(以页面访问量表示)是

log ƒ(ℓ)+#other-relevant-leaves

甚至小于(或最多等于)案例1的成本,但这是允许的。

我希望我足够清楚。

N.B。成本以页面访问的形式表示,因为从/到第二项-⁠storage的I / O操作在时间上是最昂贵的(我们忽略了在主内存中扫描整个页面的成本,但我们只考虑访问它的成本。)