《闪存数据库概念与技术》
厦门大学数据库实验室 林子雨 编著
(本网页是第4章内容,全书内容请点击这里访问本书官网,官网提供本书整本电子书PDF下载)
第4章 闪存数据库概述
闪存数据库与磁盘数据库的显著区别在于,前者采用闪存作为数据库系统的底层存储介质,而后者采用磁盘作为存储介质。存储介质的变化,会影响到DBMS的性能发挥,其中影响最大的就是DBMS存储性能,而存储性能又是数据库整体性能的关键环节,较差的存储性能必然导致较差的数据库性能。如果直接把面向磁盘设计的DBMS直接移植到闪存上面,不仅不能充分利用闪存优良特性来获得最佳的数据库性能,甚至在某些情况下会导致数据库性能的下降。因为,面向磁盘设计的DBMS,在各种存储优化机制中都以磁盘技术特性为依据,在优化机制设计上都是为了达到两个方面的目的,一方面,充分利用磁盘高顺序读写带宽,另一方面,尽量避免随机读写操作带来的高延迟。而闪存和磁盘具有截然不同的技术特性,这意味着之前的各种数据存储优化机制在闪存数据库上将无法取得好的性能,必须重新设计面向闪存的数据库存储优化机制。此外,存储介质的变化对于DBMS其他方面也会产生影响,需要重新设计能够充分利用闪存特性的相关机制,比如重新设计事务管理机制。
本章首先介绍基于磁盘的DBMS存储性能优化技术,然后阐述设计实现面向闪存的DBMS的必要性、考虑因素和技术路线,接下来介绍采用三种不同技术路线的代表性研究,即设计面向DBMS的FTL的方法、采用FTL并修改面向磁盘的DBMS的部分模块的方法和抛弃FTL并修改面向磁盘的DBMS的部分模块的方法。
4.1 基于磁盘的DBMS的存储性能优化技术
图[DBMS-storage-hierarchy]给出了数据库系统的存储层次架构。在数据库中,多个关系和索引在逻辑表空间上会被聚集到一起,然后保存到存储介质上。缓冲区管理器维护了一个内存缓冲区池,可以把数据缓存在内存中。存储管理器负责针对底层存储设备的IO操作。存储管理器可以直接访问设备,或者可以通过文件系统来执行IO操作。
图[DBMS-storage-hierarchy] 数据库系统的存储层次架构
大多数具备存储性能优化机制的DBMS,一般都采用以下几种技术来改进磁盘的存储性能:
- 缓冲区:在内存中设置数据库页的缓存可以有效提升数据库的性能,通过把那些经常被访问的数据库页放置到缓冲区中,当外部请求到达时,如果请求页正好在缓冲区中,那么,就不需要到辅助存储设备(比如磁盘或闪存)中读取该页,由于内存读写速度要远远高于辅助存储设备,因此,缓冲区可以明显减少I/O开销。
- 页布局:使用基于行或列的页布局或者它们的组合,来减少磁盘IO代价。存在两种主要的页布局方式,即基于行的页布局和基于列的页布局。如果需要读取整行数据,那么,行布局方式比较好,如果只需要读取一部分属性,那么,采用列布局更加合适。此外,也存在其他类型的混合布局方式,比如PAX和DMG,这些页布局方式混合了行和列两种方式。
- 数据压缩:使用数据压缩,以增加CPU开销为代价来改进磁盘有效带宽。列式存储可以更好地支持压缩,因为,它把属于同一个属性的值会被保存在一起,这些值具有相同的数据类型,可以获得更高的压缩率。因此,在数据库的物理设计阶段,数据库管理员会频繁使用不同的压缩模式,来优化性能和存储空间。
- 索引:是数据库系统组织管理数据的一种重要方式,可以有效提升数据库查询的性能。
- 预抓取:使用数据库和文件系统预抓取来分摊寻址代价,即数据库存储管理器会预先抓取一些目前还暂时不会立即用到的数据,通常是从磁盘中提前读取额外的与当前数据相邻的一些连续的页。磁盘的预抓取提供了两种好处:第一,一次读取更多的数据,可以把很高的随机读取延迟的代价进行分摊;第二,当数据最终被计算所需要时,它已经在内存中了,这样可以加快计算速度。在现代数据库系统(例如SQL Server Enterprise)的存储管理器中,可能会预抓取超过1024页。
- IO调度:重新排序、调度和延迟IO请求,从而在不同的数据请求之间最小化磁盘延迟。在操作系统内,IO调度器通过合并、重新排序和延迟请求,来优化底层存储设备的性能。存储设备位于数据库系统存储层次架构的最后一层,也可以优化IO调度。对于磁盘而言,控制器可能会根据当前的磁头位置,再次重新排序或者延缓请求,从而改进磁盘性能。
总的来说,在数据库系统的存储层次架构中,包含了在不同层面的不同优化。存储管理器和文件系统都会采用数据预抓取来减少访问延迟,并且通过优化数据布局来减少寻址次数。最后,磁盘调度器和设备驱动会重新排序操作顺序,从而最小化寻址开销。
4.2 设计面向闪存的DBMS的必要性
文件系统的负载通常具有一定的局部性和顺序性,但是对于一个典型的数据库负载而言(比如TPC-C),在数据访问方面,具有很低的局部性和顺序性,在执行数据库负载时,随机写操作会分散到磁盘的整个物理空间。因此,类似预抓取和写缓冲这些延迟写入技术,对于这种负载类型就没有什么效果。经过多年的发展,磁盘已经成为一种非常成熟的存储技术,具有很大的存储带宽,但是,由于磁盘中存在机械部件,包含盘片转动和磁头移动的寻址开销,因此,磁盘的随机读写操作开销比较大,延迟比较高。可以说,磁盘的较大的随机读写延迟,已经成为基于磁盘存储的数据库应用的性能瓶颈。
基于闪存的存储设备(比如固态盘),相对于磁盘而言,具有很低的读写延迟,前者的读写延迟要比后者小一个数量级,这使其成为可以替代磁盘的新一代存储介质,并且可以明显改进数据库事务的吞吐量。随着闪存技术的不断发展和普及,可以考虑把整个数据库运行在基于闪存的计算平台上,或者把一个嵌入式数据库系统运行在一个轻量级的、基于闪存的计算设备上。尤其是对于采用闪存的便携式设备而言,为这些设备开发的应用变得越来越复杂,所需要管理的数据量也越来越大,由此,更加需要有一个嵌入式的、基于SQL的DBMS而不是文件系统来支持应用开发和提供运行时数据管理引擎。当前,几乎所有主流RDBMS厂商都为手持设备或嵌入式操作系统(包括Symbian OS,Palm OS,Window/CE和嵌入式Linux),提供了一个移动、嵌入式、轻量级的DBMS,包括Oracle Lite、Sybase iAnywhere、Berkeley DB、Microsoft SQL Server 2005 CE和IBM DB2 Everyplace等。基于闪存的DBMS具有广阔的应用前景,除了应用于便携式设备,它还可以应用到很多其他领域。比如,微软的MyLiftBits项目[GemmellBL06]实践表明,个人信息管理系统需要管理更加复杂的数据类型和查询,闪存可以很好地应用于这类系统中。闪存是可以支持下一代智能卡系统的数据管理需求的有力候选者。此外,无线传感器网络设备也都需要闪存作为数据存储介质,为了提供一些复杂的查询能力,这些设备也需要嵌入式DBMS提供数据管理功能[Zeinalipour-YaztiLKGN05]。
但是,当前市场上的各种主流DBMS产品都是针对磁盘设备开发的,如果直接应用到闪存存储设备上,将无法获得好的性能,因为闪存的读写特性和磁盘具有很大的区别。首先,传统的DBMS在设计上,都尽量避免大量的随机读写,而采用顺序读写来加快速度,但是,对于闪存固态盘而言,顺序读和随机读几乎具有相同的高性能,传统DBMS将无法充分利用闪存的这个特性来提升数据库整体性能。其次,传统的DBMS都假设读写代价是相同的,但是,这点对于闪存并不成立,闪存的读速度要比写速度高1个数量级,因此,传统DBMS无法发挥闪存具备较高读性能这个优势。最后,闪存存在“写前擦除”的限制,而擦除操作的延迟通常较长,可以达到1500ms,传统的DBMS并没有考虑到闪存的“写前擦除”问题,很多小数据量的数据库更新操作会带来大量的闪存擦除操作,严重恶化数据库整体性能。比如,对于一个零售商店的商品数据库而言,在每个购物车完成结算以后,都需要去更新售出的各种商品的库存数量,这就需要更新许多个页。如果DBMS直接使用了基于FTL的闪存存储,就会包含大量的垃圾回收操作,从而严重影响系统整体性能。
可以说,不考虑闪存特性的各种数据结构和算法,是不可能让DBMS获得好的性能的。就以查询优化器为例,当前的主流的DBMS中,存储介质的特性是在创建表空间的时候就已经确定的,基于代价的查询优化器会根据磁盘的特性来预估查询执行时间,查询优化器也是根据磁盘的访问特性来更好地选择查询执行计划,比如,如果一个设备具有较小的平均延迟,那么一个查询就可以采用读取记录列表的方式执行(即根据一系列不连续的记录ID来分别读取不同的记录);如果一个设备具有较大的平均延迟,就可以采用全表扫描的方式执行查询(即连续读取表中的所有记录)。如果底层采用闪存设备,则查询优化器就无法做出最优的查询执行计划,因为优化器都是假设以磁盘作为存储设备而做出查询计划的,这种为磁盘量身订制的查询计划当然无法在闪存设备上获得好的性能。因此,如果没有设计出结合闪存特性的数据结构和算法,现有的数据库系统是无法充分发挥闪存的优点的。虽然Lee等人[LeeMPKK08]用大量实验证明,如果直接用闪存固态盘替换磁盘,那么,即使没有任何的软件修改或者其他优化措施,某些特定的数据库操作的性能也可以改进2-10倍。但是,他们在实验测试时的负载并没有包括小数据量的随机写操作(即每个随机写操作只涉及很小的数据量),而实际情况是,在企业OLTP应用中,会存在大量的小数据量随机写操作,而且这种写操作会严重恶化闪存的性能。因此,如果闪存设备要最终替换磁盘,包括小数据量随机写在内的许多问题都是不可忽视的,必须有相应的解决方案。
因此,设计面向闪存的DBMS具有很强的必要性和重要性,使得我们需要重新审视现有的许多DBMS实现技术。目前,已经有一些研究提出了一些比较简单的闪存数据库原型系统,比如PicoDBMS[PucheralBVB01]、LGeDBMS[KimBLLJ06]和FlashDB[NathK07]等。PicoDBMS是一种面向Smartcard的小型数据库系统,它的结构和功能都比较简单,为了能够应用到资源受限的SmartCard环境中,PicoDBMS对关系按照列的方式进行分解,并采用了基于指针的存储模型来降低数据存储量。LGeDBMS是一个应用于基于闪存的嵌入式设备上的、微缩版本的DBMS,它借鉴了基于日志的文件系统[RosenblumO92]的设计原理,对闪存空间进行直接管理,它把整个数据库看成是一个单独的日志,所有的数据库更新操作都会被顺序地追加到日志的尾部。在提供存储管理能力的基础上,LGeDBMS同时也提供了一定的查询处理和恢复功能。LGeDBMS还充分考虑了嵌入式设备应用环境中事务执行频率较低且无并发的特点,采用传统的影子页技术来实现简单的事务处理和恢复功能。FlashDB是一个为传感器网络而优化的、自适应的、基于闪存的数据库,提供了存储管理、缓冲区管理和查询处理等功能。FlashDB使用了一个新的、自适应的B+-树索引,可以动态地根据负载和底层的存储设备来调整它的树结构。
总体而言,闪存数据库系统的研究具有很强的必要性,但是,当前的研究还只是处在初级阶段,只出现了一些简单的原型系统(比如上面论述的PicoDBMS、LGeDBMS和FlashDB),尚无可以大规模商用的成熟产品出现,因此,该研究领域在未来具有很大的发展空间[MengJCY12]。
4.3 闪存特性对DBMS设计的影响
闪存主要包括三个方面的明显特性:(1)异地更新;(2)没有机械部件;(3)读写速度不对称。闪存的这些特性对DBMS各个模块设计都会产生影响,包括IO单位、数据分簇、缓冲区、页布局、索引、查询处理和优化以及事务管理。
4.3.1 对IO单位的影响
在一个操作系统或者DBMS中,IO操作是以块为单位。随着内存大小、CPU处理能力和IO带宽的不断增加,IO操作单位的大小一直在持续增加。例如,默认的块大小是16KB,在一些读操作比较集中的负载中比如数据仓库,一般推荐采用64KB的块大小。但是,对于闪存数据库而言,需要重新审视IO操作最优块大小的问题,因为,在闪存数据库中采用一个较大的块作为IO单位不一定是最好的。一般而言,采用较大的块作为IO操作单位的理论基础是,采用较大的块可以帮助实现数据预抓取,加快数据读取速度。但是,在闪存中数据预抓取策略变得不再重要,相反,一个较大的块会引起缓冲区空间的浪费。更加严峻的问题是,如果对较大的块执行小数据量的更新操作,会引起擦除操作。
4.3.2 对页布局的影响
绝大多数基于磁盘的DBMS都支持基于记录的页布局(或称为行式页布局),即一个记录的各个属性会被连续地存储在页中。这种页布局对于OLTP而言可以获得很好的性能,因此,在以OLTP应用为主的商业时代,这种页布局方式得到了广泛的应用。但是,对于一个闪存数据库而言,采用这种页布局方式可能会导致一些性能问题。闪存数据库的一个技术难题就是,如何高效地处理针对闪存的小数据量的随机写操作,因为数据库负载中包含大量这种只涉及很少数据量的随机写操作。小数据量随机写操作会引起代价高昂的擦除操作,恶化闪存数据库的整体性能。针对元数据的更新操作,是小数据量随机写操作的一个重要来源。比如,一个数据块通常会包含一个头结构和记录区域。任何记录更新(包括插入、删除和修改),都需要改变头结构。在闪存数据库中,这就意味着需要为头结构执行很多擦除操作。
4.3.3 对数据分簇的影响
磁盘设备包含机械部件,需要在不同位置之间移动磁头来读取数据,频繁的磁头移动会严重降低数据读取的性能,因此,在基于磁盘的DBMS中,为了加快数据读取速度,通常采用数据分簇技术,即把相关的数据都存储在磁盘中相邻的位置,这样就可以最小化磁头移动距离,很容易实现对相关数据的批量预抓取。
由于可以帮助实现预抓取,因此,分簇技术可以有效提高磁盘数据库中的读操作性能。但是,在闪存数据库中,数据预抓取的作用已经变得不再重要,因为闪存读操作非常快,不需要通过提前抓取数据来提高读操作速度。相反,对于闪存而言,写操作和擦除操作的性能很低,写操作速度要比读操作慢一个数量级,擦除操作速度要比读速度慢两个数量级。因此,对于闪存而言,面向写操作的数据分簇技术可能更加合适,也就是把相关的对象尽量写入到同一个物理块中。
4.3.4 对查询处理和优化的影响
在基于磁盘的DBMS中,哈希连接和排序合并连接方法,可以比嵌套循环连方法接取得更好的性能。这是因为,磁盘中的读写操作速度是相同的,并且有足够的RAM来运行哈希或排序合并连接算法。在采用哈希连接或者排序合并连接方法时,需要把中间结果写入到磁盘中,而嵌套循环连接则采用了只读的工作模式,不需要为连接操作开辟额外的辅助存储器存储空间。因此,当采用闪存作为辅助存储器时,嵌套循环连接算法会比哈希连接和排序合并连接方法更加合适;而且,如果嵌套循环连接算法的内关系上存在索引,那么,就可以获得更好的性能。对于一个给定的查询而言,DBMS中的查询优化器会枚举不同的执行计划,评估每个执行计划的代价,并且选择代价最小的计划来执行查询。既然从磁盘更换到闪存以后,不同连接算法的相对代价会发生变化——磁盘中更适合采用哈希、排序合并连接而闪存中更适合采用嵌套循环连接,那么,就需要重新审视查询优化技术中的代价评估机制。
查询优化技术中的代价评估机制需要重新审视的另外一个方面,就是索引扫描的代价。在闪存中,索引扫描更适合采用全表扫描,因为闪存具有一致的随机访问速度和快速的读取时间。这就意味着,闪存中访问一个索引的代价要比磁盘中低许多,而且我们可以更加准确地评估它的代价,因为闪存具有一致的随机访问速度。
4.3.5 对缓冲区替换策略的影响
在操作系统或者DBMS中使用的缓冲区替换算法,通常假设读操作和写操作的速度是一致的。但是,这种假设在闪存中不再成立,因为,闪存的读写速度不对称,这就意味着,在闪存数据库中,传统的性能评价指标,比如缓冲区命中率,就不再适用,需要重新设计面向闪存的缓冲区替换算法。传统的替换策略只考虑缓存的命中率,即在给定的缓冲区尺寸下,最小化缓存脱靶的概率。但是,最小化缓存脱靶率,在基于闪存的数据库系统中,可能会带来较差的I/O性能。这是因为,和磁盘相比,闪存有一个内在的特性——读写不对称性,即写操作会比读操作慢一个数量级,而且由于写操作可能会引起擦除操作,这就进一步提高了写操作的代价。由于这种非对称性,缓存管理策略必须对写操作和读操作进行区分。面向闪存的缓冲区替换算法一般采用的思路是:尽量减少写和擦除操作的数量,哪怕是以增加读操作数量为代价。
4.3.6 对索引的影响
在基于磁盘的DBMS中,会使用B-树索引来支持对列值进行有选择性地快速访问。当被索引的列值发生变化、新的记录插入、已有的记录被删除时,索引树的节点必须被更新,这就会引起索引节点的分裂或者合并,其中会涉及许多小数据量的随机写操作。由于闪存采用异地更新的方式,因此,每个B-树中节点的更新,都会引起闪存写操作,而且,某个节点的更新可能会不断传播扩散到其他节点,引起其他节点的更新,从而导致更多的闪存写操作。因此,必须针对闪存特性设计相应的索引结构。
4.3.7 对事务管理的影响
事务管理有两个关键的组件,即并发控制和恢复。对于闪存数据库中的并发控制而言,快照隔离方法可能比较合适,而不是采用加锁技术。在快照隔离方法中,会同时维护同一个数据的多个版本,来满足不同查询的要求,因为,在不同时间点的查询需要访问不同的快照。闪存可以有效地支持这种并发控制模型,因为闪存具有异地更新的特性,更新后原来的旧版本数据不会被立即删除。闪存异地更新的特性,允许同一个数据可能存在多个版本,我们可以被分利用这点来替代传统的基于日志的恢复机制。也就是说,每个版本都可以看成是某种形式的日志。
4.4 面向闪存的DBMS的设计考虑因素
面向闪存的DBMS的设计,必须克服闪存的缺陷,并充分利用闪存的独特特性,从而使得面向闪存的DBMS可以获得更好的性能,主要需要考虑以下几个方面的因素:
- 读写速度不对等:闪存的读速度要比写速度快许多,因此,在设计DBMS时,应该重点考虑减少写操作。
- 一致的随机访问速度:对于闪存而言,由于不存在可移动的机械部件,因此,随机访问和顺序访问的速度是一致的,对于随机访问没有长时间的寻址开销,因此,没有必要再执行顺序读操作。这个特性也会影响到一些设计上的策略,比如在设计数据对象和日志在闪存中的存储位置的时候可以更加自由。文献[LeeM07]在设计IPL时,就是利用了闪存的这个特性,把日志记录分散存储到闪存中的任何位置,而没有采用顺序存储。
- “写前擦除”的限制:这是设计DBMS时需要考虑的关键因素。在闪存中,如果数据库系统还坚持采用就地更新的方式,那么,由于存在“写前擦除”的限制,就必须首先把闪存中包含该更新的整个擦除单元读取到内存中,在内存中完成就地修改,然后把该擦除单元进行完整的擦除操作,最后,把内存中的修改后的内容写入到这个擦除单元中。这种就地更新的方式,代价太高,这就要求在闪存中必须采用异地更新的方式。
- 读操作代价比写操作和擦除操作代价低很多:这个闪存特性要求在设计DBMS时,必须尽量有效减少写操作的数量,从而减少擦除操作的数量,即使这可能会导致读数量的增加。因为,读操作代价要比写操作和擦除操作的代价低很多,在减少写和擦除操作的同时,尽管会带来读操作的增加,但是,最终的整体性能仍然可以获得提高。
- 即刻代价和延迟代价问题:针对一个闪存页的更新操作,由于闪存采用了异地更新的方式,会把数据页写入到一个新的闪存页中,让包含旧数据的页失效。写入到新的闪存页就会引起一个即刻代价,也就是说,这个代价在写操作发生的时候就产生了。但是,同时要注意到,包含旧数据的无效页,不会被立即擦除,它会在以后的垃圾回收过程中被执行擦除操作,在那时才会产生代价,因此,可以认为,这是一个由于更新操作引起的延迟代价。因此,在设计算法时,不仅要考虑即刻代价,也要充分预估到由此产生的延迟代价。
- 随机写操作严重恶化闪存性能,应该尽量改变DBMS的负载模式。首先,应该尽量避免在闪存上面进行随机写操作,即使以增加读操作或其他额外开销为代价。其次,所有的写操作都应该具有足够大的尺寸,从而在每个IO操作中,可以完全覆盖一个或多个擦除块。
- 对现有的DBMS体系架构的影响最小化:当前主流的基于磁盘的DBMS已经是一个非常成熟的技术,产品的各种功能(比如查询编译、事务机制、灾难恢复和性能优化等)已经相当完备,面向闪存的DBMS在设计时,应该充分继承和利用已有的架构和技术,减少设计工作量,充分发挥已有成熟技术的优势,尽快获得成熟的产品。而且,当前主流的基于磁盘的DBMS,都采用了模块化的设计,对其中的部分模块(比如存储模块)进行替换是可以实现的。
4.5 设计面向闪存的DBMS的技术路线
通过对大量相关研究的综合分析,我们总结得到,为了提高DBMS在闪存设备上的性能,目前基于闪存的DBMS的设计所采用的技术路线主要包括以下几个方面:
(1)设计面向DBMS的FTL。直接采用原来的针对磁盘设计开发的DBMS,在DBMS和闪存存储二者之间,增加一个中间软件层FTL,在充分考虑数据库负载特性和闪存特性的基础上,设计符合这两个特性的、面向DBMS的FTL机制。这类方法的典型代表是DFTL机制[GuptaKU09]。
(2)采用FTL并修改面向磁盘的DBMS的部分模块。继续采用中间软件层FTL来访问闪存设备,但是,对面向磁盘的DBMS的部分模块(比如索引)进行修改,从而获得更好的性能。这类方法的典型代表是基于日志的B-树索引[WuCK03]、B+-树索引[OnHLX09][WuKC07]和采用自适应B+-树的FlashDB[NathK07]。
(3)抛弃FTL并修改面向磁盘的DBMS的部分模块。抛弃中间软件层FTL,直接访问闪存,对原来面向磁盘的DBMS的部分模块(比如缓冲区管理和存储管理模块)进行重新设计,使其能够在闪存上发挥最好的性能。目前主流的商业DBMS都采用了模块化的设计,对其中一些模块进行替换是可行的。这类方法的典型代表是基于日志的方法(比如IPL[LeeM07])和基于影子页的方法[LeeKWCK09]。在IPL方法中,作者设计开发了IPL模拟器,实现了DBMS中的缓冲区和存储管理模块的功能。在基于影子页的方法[LeeKWCK09]中,作者设计的DBMS原型系统被称为“AceDB Flashlight”,它就是对AceDB(一个面向磁盘的DBMS)的事务模块和存储管理模块进行了修改。
(4)完全重新设计面向闪存的DBMS。抛弃中间软件层FTL和原来面向磁盘的DBMS,完全重新设计面向闪存的DBMS。由于设计和实现代价过高,开发周期长,不利于在短期内把DBMS迅速部署到闪存平台上,因此,目前没有相关研究采用这类方法。
4.6 进一步讨论
当数据库采用磁盘作为存储介质时,磁盘IO性能往往成为整个系统的瓶颈。闪存比磁盘具有更高的IO性能,在数据库系统中会被越来越多地作为底层的存储介质。由于闪存IO的高性能,可能某些情况下系统的性能瓶颈会发生转移,即闪存IO将不再是瓶颈,而CPU则会成为系统的主要瓶颈。
文献[LvCC09]用实验验证了这种瓶颈转移的可能性。作者采用TPC-B测试基准和SQL Server 2008进行了数据库负载测试,图[cuibin-04]显示了数据和日志文件的实时写入速度以及CPU占用情况。从中可以看出,在整个数据库负载运行过程中,日志写入操作一直贯穿始终,速度变化很小。数据文件的写入操作则具有突发性的特点,而且写入量比较大,这主要是由数据库缓存回写数据造成的。当数据写入量较小时,CPU占用率很高,因为,这时CPU在集中执行事务操作。当写入操作执行时,CPU占用率会下降。由此可以看出,当采用闪存存储时,在数据库运行过程中,如果存在较多的小数据量的写操作,写操作会快速完成,闪存IO不会是系统的瓶颈,但是,这种小数据量写操作会大大增加CPU占用率,导致CPU称为系统的性能瓶颈。
图[cuibin-04] 数据和日志的实时写入速度以及CPU占用情况
因此,在闪存数据库系统中,闪存和CPU之间可以互相促进,共同提高系统整体性能。一方面,CPU性能每年都在不断提升,使用闪存可以更好地发挥出CPU的高性能。另一方面,在设计数据库时,应该尽量优化事务处理过程,降低CPU负载。
4.7 本章小结
本章内容首先介绍了基于磁盘的DBMS的存储性能优化技术,然后指出了设计面向闪存的DBMS的必要性;接下来,阐述了闪存的不同特性对DBMS设计的影响,包括对IO单位、页布局、数据分簇、查询处理与优化、缓冲区替换策略、索引和事务管理等方面的影响;然后,又介绍了面向闪存的DBMS的设计考虑因素,包括读写速度不对等、一致的随机访问速度、“写前擦除”的限制、读操作代价比写操作和擦除操作代价低很多、即刻代价和延迟代价问题、应该尽量改变DBMS的负载模式以及对现有的DBMS体系架构的影响最小化等等;最后,介绍了设计面向闪存的DBMS的技术路线,包括设计面向DBMS的FTL、采用FTL并修改面向磁盘的DBMS的部分模块和抛弃FTL并修改面向磁盘的DBMS的部分模块等等。
4.8 习题
- 说明设计面向闪存的DBMS的必要性。
- 分别阐述闪存特性对DBMS设计的影响,包括对IO单位、页布局、数据分簇、查询处理和优化、缓冲区替换策略、索引和事务管理等方面的影响。
- 阐述在设计面向闪存的DBMS时需要考虑的因素。
- 阐述基于闪存的DBMS的设计所采用的技术路线。