数据库架构相关
Architecture of a Database System. Joseph M. Hellerstein, Michael Stonebraker and James Hamilton
图灵奖获得者Michael Stonebraker的论文之一,具体介绍了数据库的架构以及相关理论和主流数据库的具体做法。
启发:
对于已经阅读过基础的数据库教材的人来说,这篇论文很适合继续深入学习和理解数据库的各个架构的。论文主要介绍了数据处理模型,并行架构,存储模块设计,事务模型实现,查询和优化器的架构,以及这些架构的共享模块。论文不但包括了书本上的基本的理论,还有一些开源和商用数据库的具体实践,这些对于理解数据库的内核都是大有裨益。另外论文对于每个内容都有大量的引用资料供有兴趣的人继续深入研究。
不足:
虽然论文本身属于介绍方向,没有太多专业的名词和实现的深入讨论,但由于涉及范围很多,因此篇幅较长(对于论文的长度来说)。
Readings in Database Systems Fifth Edition (2015). Peter Bailis, Joseph M. Hellerstein, and Michael Stonebraker
非常有名的红宝书,也是出自Michael Stonebraker之手。本书主要集中讨论了目前DBMS的一些主流的发展方向和趋势。
启发:
与上面的Architecture of a Database System相比,本书主要集中于介绍DBMS发展方向和趋势,包括了当前非常流行的大数据,NoSQL,数据分析等。同时也会由作者对于该技术的一些主观评价和建议,对于想了解当前发展趋势很有指导作用。同时,论文在不同话题都有一些典型的论文推荐,可供有兴趣者深入研究。
不足:
某些地方作者的评价可能会较为主观,但也算是一种参考吧。某些内容由于篇幅关系,只是蜻蜓点水,对于非从业人员来说可能较难理解。
日志恢复
ARIES: A Transaction Recovery Method Supporting Fine-Granularity Locking and Partial Rollbacks Using Write-Ahead Logging. C. MOHAN, DON HADERLE, BRUCE LINDSAY, HAMID PIRAHESH, PETER SCHWARZ
相当经典的日志恢复算法,很多数据库实现的恢复算法都有ARIES的影子。
启发:
ARIES的实现相对简单而且高效,支持事务部分回滚,行锁,fuzzy checkpoint。ARIES对于数据页的所有更新都会记录更新日志(undo/redo log),并且利用LSN把数据页和更新日志关联起来,通过正确链接同一事务的所有更新日志,对于嵌套回滚等情况也能正确处理。另外,ARIES不强制checkpoint的时候刷新所有脏页到硬盘等其它特性,总之ARIES整个算法非常灵活,具体实践时可以根据需要进行简单修改定制。
不足:
ARIES算法整个部分不算复杂,但论文花费了大量篇幅去介绍和对比之前存在的各种恢复算法,这样可能使第一次阅读的人比较难掌握ARIES的精髓,因此建议先着重理解ARIES算法的整体部分,然后再着眼于其它内容。
缓存替换算法
The LRU-K Page Replacement Algorithm for Database Disk Buffering. E. J. O’Neil, P. E. O’Neil, and G. Weikum
2Q: A Low Overhead High Performance Buffer Management Replacement Algorithm. T. Johnson and D. Shasha
LIRS: An Efficient Low Inter-reference Recency Set Replacement Policy to Improve Buffer Cache Performance. Song Jiang and Xiaodong Zhang
ARC: A SELF-TUNING, LOW OVERHEAD REPLACEMENT CACHE. Nimrod Megiddo, Dharmendra S. Modha
4篇论文分别对应4种不同的缓存替换算法,不单对于数据库的缓存,在其它需要应用缓存的情况(如文件系统的cache)下都有着重要的指导作用。
启发:
LRU-K,2Q,LIRS三种算法都基于倒数第二次的访问时间,以此推断块的访问频率,从而替换出访问频率低的块。ARC是采用自适应算法去根据不同的workload调整cache,对比之前三种需要配置参数才能发挥最佳性能的算法,ARC不需要配置参数也能发挥出最佳的性能。另外这4种算法都是scan-resistant,也就是可以避免扫描污染cache。
不足:
前三种模型都需要经过实际测试配置最佳参数,ARC模型过于理想化,没有讨论诸如内存被固定不能刷新的时候如何处理,因此应用需要根据实际情况进行调整。
数据存储相关
The Log-Structured Merge-Tree (LSM-Tree). Patrick O'Neil, Edward Cheng, Dieter Gawlick, Elizabeth O'Neil
LSM树是disk-based的数据结构,对于Insert能够提供比B树更低IO开销。顺带一提,HBase的底层数据结构就是基于LSM树。
启发:
在刷新数据页时,会导致大量的随机IO,这些随机IO主要开销在于硬盘机械臂转动(也就是寻址)。利用内存构建B树作为写缓存,加上利用延迟和批量索引的修改进行merge sort,再刷新到硬盘上,能大大减少IO写入硬盘寻址带来的开销。
不足:
对于查找来说,在某些情况下会造成效率下降,因此LSM树只对于写入大大超过查找的情况才更加有效。
由于需要利用内存建立B树进行插入缓存,因此一般需要较大的内存开销。
对于目前流行市面的SSD不一定有较大的性能提升。
论文对于LSM树的开销建立了相关的数据模型,并且进行了较为详细的理论证明,比较难看懂。
The Design and Implementation of a Log-Structured File System. Mendel Rosenblum, John K. Ousterhout
Log-Structed是一种把随机IO转换为顺序IO的存储管理方法。
启发:
论文提出了Log-structed的存储管理方法,该方法把所有的修改作为log,然后首先保存到内存中,接着批量顺序写到硬盘上,这样乱序IO转变顺序IO输,节省硬盘寻址时间,提高了硬盘传输利用率。同时为了更好管理硬盘上的大空间块,把多个log划分为一个segment,并且利用基于开销(cost-based)的清理策略对大空间块进行压缩和回收。论文在此理论上实现了Sprite LFS的文件系统,并且传输利用率高达70%超越了Unix的5-10%。
对于数据库来说,可以参考log-structed方法,把原来刷新B树的数据页的随机写转变为顺序写。
不足:
论文主要是针对文件系统的实现,要求对于所有的修改都要转为log输出到硬盘上,因此可能会增加输出的字节数。同样,对于SSD来说,性能提升可能不会有显著的变化。
C-Store: A Column-oriented DBMS. Mike Stonebraker, Daniel J. Abadi, Adam Batkin, Xuedong Chen, Mitch Cherniack, Miguel Ferreira, Edmond Lau, Amerson Lin, Sam Madden, Elizabeth O’Neil, Pat O’Neil, Alex Rasin, Nga Tran, Stan Zdonik
论文主要介绍Column-store,也就是列式存储的实现细节。同样也是Mike Stonebraker的论文。虽然论文只是实现了少部分特性,但不可否认的是里面的观点都很有新颖的见解,可以有很多启发。
启发:
论文以一个实现了Column store的存储引擎,C-Store,作为范例,介绍了Column store的一些实现细节。C-Store主要是针对数据仓库类型的查询(在大量的数据执行聚集的即席查询)以及OLTP类型的事务进行特殊的列式存储,从而达到了高效率的读和写。另外论文也提到了C-Store用于分布式时如何达到K-sfaety的高可用性以及避免两阶段提交(2PC)的事务特性。
具体特性包括利用经过优化写入性能的Writeable Store(hot data放内存)和优化读性能的Read-optimized Store两个存储模块;根据查询去冗余存储表的不同列的不同顺序的数据作为投影,从而使查询可以使用最佳投影;使用多种编码方式压缩列数据;面向列存储的查询优化器和执行器;通过存储重叠列作为投影,提供了分布式高可用性;snapshot isolation可以避免2PC和查询时的锁。
不足:
论文提出的观点虽然新颖,但实现难度较大,在做性能对比的C-Store也只是进行了读性能对比,Writeable Store则甚至还没能达到测试要求,并且也只能运行在单机上。很多特性是否和论文提到那样有效还有待深入验证和讨论。
除此之外,读优化需要按照查询的类型进行人工选择列来合成投影,也就是需要人工介入优化。
并发控制
Efficient Locking for Concurrent Operations on B-Trees. PHILIP L. LEHMAN,S. BING YAO
介绍了一种并发操作B树的算法。
启发:
利用了B+树的变种Blink树,实现了B树的简便高效的查找和插入的并发操作。
Blink树, 是在B+树的每个结点添加一个link指针指向右边兄弟。对于插入,利用Blink树的link指针,在任何时刻(包括split)每个进程(线程)最多获取三个结点的锁。对于查找,则不需要获取任何结点的锁。
由于限制每个进程(线程)获取的锁,因此会大大提高了并发度。
不足:
对于删除,论文中并没有提供高效的并发操作。
具体做法是,不删除非叶子结点的key,只删除叶子结点的数据,并且不会执行合并操作。这是考虑到现实应用中删除属于比较少见的操作。对于删除过多数据,导致叶子结点的使用率相当低的时候,可以采用锁住整棵树,然后执行整理操作。
转载自原文链接, 如需删除请联系管理员。
原文链接:数据库的一些论文的个人整理,转载请注明来源!