
B
树的实现
|
71
格本身保持不变。在这样做之后,对应的单元格不再是
可寻址的
,它的内容将不再出现
在查询结果中,也不需要将其置为 null 或移动相邻单元格。
当页被分裂时,只对偏移量进行调整。由于页的其余部分不可寻址,所以偏移量被截断
的单元格不再可访问,因此每当新数据到达时,它们将被覆盖,或者在清扫进程中被垃
圾收集。
有些数据库依赖于垃圾收集,并将已删除和更新的单元格留在原位,以便进行
多版本并发控制(参见 5.3.6 节)。在更新完成之前,单元格对于并发执行的事
务保持可访问性,一旦没有其他线程访问它们,就可以立即回收单元格。一些
数据库维护跟踪
幽灵记录
(ghost record)的数据结构,一旦所有可能已经看到
它们的事务完成,这些幽灵记录就会被回收 [WEIKUM01]。
由于删除操作仅丢弃单元格偏移量,而非搬运剩余单元格或物理地移除目标单元格以释
放占用的空间,所以释放的字节可能最终分散在整个页上。在这种情况下,我们说页是
碎片化的
(fragmented),需要进行碎片整理。
要进行写操作,我们通常需要可以放入单元格的一块连续的空闲区域。要将空闲碎片重
新组合在一起来满足写入的需要,我们必须
重写
页面。
插入操作保留元组的插入顺序。这对空间碎片并没有显著的影响,但是如果将元组按顺
序排列,则将有助于在顺序读取时进行高速缓存预取。
更新操作主要适用于叶子层:内部页的键多用于引导导航,其仅定义了子树的边界。
此外,更新是在每个键的基础上执行的,除非创建溢出页,否则这通常不会导致树中
的结构更改。然而,在叶子层上 ...