在索引中存储为数据条目的三种备选方案之一是数据条目 k * ,它是具有搜索键值 k 的实际记录。我的问题是,如果你要将实际记录存储在索引中,那么创建索引的重点是什么?
答案 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
所以我们想要构建另一个索引来有效地支持这种查询。
我们知道集群 B + -备用2的备注对于范围查询是有效的,因为它们只需要搜索第一个好结果(比如说一个b=25
),然后对该结果指向的关系页面进行1页访问,最后扫描该页面(最终扫描其他页面),直到记录落在给定范围内。
总结一下:
最终费用(以页面访问量表示)是
log ƒ(ℓ)+ 1 + #relevant-pages
其中ƒ
是扇出,ℓ
是叶数。
不幸的是,在我们的例子中,搜索键b
上的树必须是非聚集的,因为关系已经按a
排序
我们也知道B + -tree在 unclustered 时在范围查询中效率不高。事实上,在树中有一个替代2或3的树,我们只存储指向记录的指针,因此对于落在范围内的每个结果,我们必须对可能不同的页面进行页面访问(因为关系与索引的顺序不同。
总结一下:
最终费用(以页面访问量表示)是
log ƒ(ℓ)+#other-relevant-leaves + #levant-tuples
请注意,元组的数量相对于页数非常更大!
使用替代方法1,我们拥有树中的所有数据,因此为了执行查询,我们:
最终费用(以页面访问量表示)是
log ƒ(ℓ)+#other-relevant-leaves
甚至小于(或最多等于)案例1的成本,但这是允许的。
我希望我足够清楚。
N.B。成本以页面访问的形式表示,因为从/到第二项-storage的I / O操作在时间上是最昂贵的(我们忽略了在主内存中扫描整个页面的成本,但我们只考虑访问它的成本。)