Milena
by Milena Ivanova

数据库设计决策,用于多版本并发控制

多版本并发控制, MVCC.,是今天最受欢迎的计划,以最大化并行性而不牺牲序列化。它是第一次在博士中提到的。论文由D.P. 1979年芦苇,于1981年首次实施了Interbase(后来开放为 火鸟),后来 甲骨文PostgreSQL. 和 Mysql Innodb发动机。许多新的事务DBMS也有利于MVCC: SAP HANAMemsql. (2016年由Tableau收购)和微软的 凉亭 在线事务处理引擎。在MVCC之前,数据库使用了基于锁定的并发控制方法。

我公司的技术, Nuodb.,也用途 MVCC. 最近在会议上提到非常大的数据库,VLDB 2017,在演示文稿中 比较数据库系统 使用多版本并发控制(MVCC)。

MVCC.系统有几种设计选择,具有不同的权衡和性能行为。 MVCC遗留系统的设计受磁盘导向的单核环境的影响。该VLDB演示的焦点是多核的MVCC可伸缩性,当多个数据版本同步的开销可能超过多版本化的效果时,MVCC在内存数据库中。这 作品纸 — by y君吴 来自新加坡国立大学和 安德鲁帕洛洛的 来自卡内基梅隆大学的团队 - 分析了四个关键的MVCC设计决策:并发控制协议,版本存储,垃圾收集和索引管理。

并发控制协议

分析了四种并发控制协议:

  1. 使用事务标识符来预编译序列化顺序的原始时间戳顺序(MVTO)算法。
  2. 乐观的并发控制(MVOCC)算法基于以下假设,即交易不太可能发生冲突。它们分为三个阶段:读取,验证和写入,协议最小化事务保存对元组锁的时间。该协议用于MEMSQL,HEAD和Hebkaton。
  3. 在两阶段锁定(MV2PL)协议中,每个事务在允许读取或修改时获取当前元组版本的锁定。该协议用于Oracle,MySQL,Postgres,SAP HANA和NOODB。
  4. 在Postgres中实现的序列化认证协议(可序列化快照隔离,SSI)维护序列化图,用于检测和删除通过并发事务形成的危险结构。

已经提出了其他协议(例如推测阅读,渴望更新)。但这些通常具有可防止缩放到许多核心的性能瓶颈。

版本存储

版本存储介绍系统如何存储物理版本以及每个版本包含的信息。存储方案对垃圾收集和索引管理有影响。

仅附加存储可以有两种版本链:最旧的最新和最新的最新版本。最古老的最新方案(Postgres和Hekaton)无需在修改元组时更新索引。但是,读取查询可能很慢,因为它们可能必须遍历潜在的长版链以获得最新的值。最新的版本链(MEMSQL和NOODB)最大限度地减少了由于大多数事务在最新的元组版本上工作以来的链遍历。当链条的头部更改时,所有索引都必须更新以指向新版本。这种性能瓶颈可以通过使用带有地图的一层间接来解决,以最新的物理地址是一些额外的存储费用。

时间旅行存储(SAP HANA)将旧版本存储在单独的表中。每个元组的主要版本存储在主表中,在时间旅行表中的多个版本中。索引不受元组更新的影响,因为它们总是指向元组的主要版本。在此存储方案中,更新将当前主版本复制到时间旅行表,并将新版本放在主表中的同一个插槽中。

最后,Delta Storage(MySQL,Oracle和Hyper)存储主表中的主要版本,并将一系列ΔSexta版本保存在单独的Delta存储中。此存储方案可以对工作负载进行内存高效,其中更新影响有限数量的元组列。

垃圾收集

所有MVCC系统都需要定期修剪版本链以管理内存利用率和性能。这种修剪被称为“垃圾收集(GC)”。最常见的GC方法是Teple级背景,系统检查每个组元组版本的可见性。较旧的未使用版本被删除。交易级GC回收过期事务生成的元组版本。它使用粗粒度纪念碑内存管理。新事务分配给当前的活动时期。当epoch到期并没有更多的活动事务时,可以回收在本epoch中更新的所有元组版本。因此,交易级GC需要跟踪每个时代的读/写事务集。

索引管理

最后,MVCC索引管理可以在辅助索引中使用逻辑或物理指针。实验表明,当索引的数量增加时,逻辑指针的性能比物理指针更好地提供25到45%。

研究结论

虽然过去的数据库研究传统上专注于优化并发控制协议,但该研究发现,协议和版本存储方案都可以对多核环境中的内存中的内存DBMS进行强烈影响。

仅附录和时间旅行存储方案受内存分配方案效率的影响。这可能成为一个瓶颈,但作者表明它可以通过每个核心分区存储空间来解决。 Delta存储方案对事务工作负载执行良好,特别是如果修改属性的分数很小。但是,它遭受了低表扫描性能,并且对分析读取密集型工作负载不是一个不错的选择。

作者使用内存中的DBMS Peloton在几个现代数据库管理系统中发现的MVCC的九个实现。 交易处理绩效委员会 TPC-C事务工作负载 使用表扫描查询扩展用于演示各种MVCC设计的整体性能。

在这个实验中,Oracle / MySQL和Nuodb在事务吞吐量方面表现出最佳性能。存储方案 - Delta和Append-ockent-ockend,在多核,主内存系统中的最新订购刻度很好。两个系统中使用的MV2PL协议在高竞争工作负载中提供相对高的性能。

下一组具有较低性能(MEMSQL和HEAD)使用乐观并发协议的乐观并发协议,可以在事务验证阶段(读取集分析)和争用时更高数量的中止事务中带来高开销。在孤立的实验中,MVOCC协议显示了中止相对较重的交易的趋势,从而浪费了比其他协议更多的计算工作。

该实验中具有最低吞吐量的系统,Postgres和Hekaton,使用oppend-opet-to-最新排序的版本记录,这限制了系统的可伸缩性。

虽然Delta存储方案显示出良好的事务性能(例如,在Oracle中使用MV2PL协议的Delta存储),它被示出了表 - 对于表扫描查询的延迟,由于花费遍历元组版本的链条,因此延迟是最糟糕的(参见图25 )。

一个有趣的观察是,原始时间戳顺序并发控制协议在微基准中显示出用于不同工作负载和争用级别的最平衡的行为。但是,这里没有研究的当代系统都没有使用该协议。

垃圾收集的实验证实了对整体系统性能的重要性。事务级GC删除过期版本,批量减少了同步开销,并显示为吞吐量的提高高达20%。但是,它可能导致吞吐量和内存占用件中的振荡。

总之,在NOODB:MV2PL协议中实现的MVCC设计选择,索引中的唯一存储方案和逻辑指针,在交易吞吐量和延迟方面都是良好的整体性能。

---

Milena Ivanova.作为Nuodb的SQL团队的软件工程师,Milena Ivanova的工作侧重于SQL查询的优化。米尔娜拥有研究背景,并在阿姆斯特丹CWI的专栏 - 商店主记忆系统MongoDB上工作了几年,是荷兰电子科学中心的数据库技术领导,负责在大科学数据上应用数据库技术。