
B
树的变体
|
109
得不额外传输一些空字节以及页的其余部分。第三个问题是解决并发问题和处理闩锁的
复杂性。
为了同时解决这三个问题,我们必须采取一种与目前已经讨论过的方法完全不同的方
法。缓冲更新有助于减轻写放大和空间放大问题,但不能解决并发问题。
我们可以通过使用仅追加存储来对不同节点进行批量更新,将节点链接成链,并使用
内存数据结构
—
该结构允许通过单个 CAS 操作在节点之间
建立
指针,从而使树无锁。
这种方法称为 Buzzword 树(Bw 树) [LEVANDOSKI14]。
6.5.1
更新链
Bw 树区分
基节点
的写入与修改。修改(
增量节点
)形成一个链:一个从最新修改到旧修
改的链表,该链表末尾则是
基节点
(base node)。每个更新都可以单独存储,而不需要
重写磁盘上的现有节点。
增量节点
(delta node)可以表示插入、(与插入无法区分的)更
新或删除。
由于基节点和增量节点的大小不太可能是页对齐的,所以将它们连续存储是有意义的,
而且由于在更新期间基节点和增量节点都不会被修改(所有修改只是将一个节点插入现
有链表头部),所以我们不需要预留任何额外的空间。
将节点作为逻辑实体而不是物理实体是一种有趣的范式转变:我们不需要预先分配空间,
不需要节点具有固定的大小,甚至不需要将它们保持在连续的内存段中。这当然有一个
缺点:在读取过程中,必须遍历所有增量并将其应用到基节点上,以重建实际的节点状
态。这有点类似于 LA 树所做的事情(参见 6.3.2 节):更新与主结构分开存放,并在读
取时重放。
6.5.2 ...