Data structures 版本化WriteHead日志-此数据结构是否存在?

Data structures 版本化WriteHead日志-此数据结构是否存在?,data-structures,database,Data Structures,Database,背景: 我读过很多DBMS使用写前日志记录,通过将更新存储为一组写操作来保持事务的原子性和持久性。我试图实现的是创建一个dbms模型,通过以下方式提高并发性 问题: 是否有一种数据结构允许我有效地(理想情况下)根据某个时间点,按1摊销,最多Ologn查找数组元素或内存位置(如果您愿意),这些元素或内存位置可能已被写操作覆盖,也可能未被写操作覆盖?这将是大约1TB的数据总量 下面是一些ascii艺术,让它更清晰一些。破折号是数据,版本0是最早的版本。箭头表示写入操作 ^ ___________

背景:

我读过很多DBMS使用写前日志记录,通过将更新存储为一组写操作来保持事务的原子性和持久性。我试图实现的是创建一个dbms模型,通过以下方式提高并发性

问题:

是否有一种数据结构允许我有效地(理想情况下)根据某个时间点,按1摊销,最多Ologn查找数组元素或内存位置(如果您愿意),这些元素或内存位置可能已被写操作覆盖,也可能未被写操作覆盖?这将是大约1TB的数据总量

下面是一些ascii艺术,让它更清晰一些。破折号是数据,版本0是最早的版本。箭头表示写入操作

^ ___________________________________Snapshot 2 | V | | V | -- --- | | -------- Version 2 | | | __________________Snapshot 1 | V | | V T| -------- | | --------- Version 1 I| | | ___________Snapshot 0 M| V V V V E|------------------------------------- Version 0 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~> SPACE/ADDRESS 解决方案的尝试:

设N为数据大小,M为版本数,p为每个版本的平均更新数

搜索每个更新的朴素算法是OM*P。 将数据划分为多个存储桶,只更新整个存储桶,并搜索存储桶的位掩码将在/B*M上,其中B是存储桶大小,这不是更好的选择。 乍一看,Bloom过滤器似乎是一个很好的候选者,除了它需要比每个内存位置的简单位掩码更多的数据,这无论如何都是不好的,因为它需要M*N/8字节来存储。 我也想到了一个标准的哈希表,但是密钥是什么呢?
事实上,现在我已经费劲地写了这一切,我想到了一个使用二叉搜索树的解决方案。我将在稍后提交它作为一个答案,但它在空间和时间上仍然是OM*log2P,这并不理想。见下文。

以下是我能想到的最好的解决方案,尽管它仍然是次优的

其思想是将每个区域放入一个二叉搜索树中,每个版本一棵树,其中每个内部节点包含一个内存位置,每个叶节点要么命中,要么未命中,可能还有查找信息,这取决于是否存在更新的数据。这是为每个版本构造的OP*logP,以及要查找的OM*logP

这不太理想,原因有二:

树是平衡的,但实际上未命中的可能性要比命中的可能性大得多,因此将未命中节点放在树中更高的位置或按节点大小排列节点是有意义的。想到了某种哈夫曼编码,但哈夫曼算法并没有保留搜索树不变量。 它需要M个树,因此需要OM*logP查找。也许有办法把这些树组合起来。