内存索引的实际应用中选择T树还是B树
原文链接:http://blog.inkernel.info/archives/19.html
一、T树与B树的比较
在T树最开始被提出的时候,其CPU效率被认为比B树要好[1]。不过20多年过去了,CPU的速度和内存的访问速度的发展不平衡,CPU缓存的容量也在不断被扩充,这又不得不成为新的考虑因素。跟B树类似,也有一些基于缓存敏感的T树的改进被提出来。
参考文献[4]对T树和B树的性能进行了新的比较,并得出在有并发操作的情况下,B树的性能要好于T树的结论。显然在没有IO瓶颈的情况下,为保证并发操作时一致性的加解锁的开销将成为影响性能的主要因素。在实验中,其对T树提出一种称为T-tail树的改进,B树则采用并发度较高的B-link树[5][9]。参考文献[4]最后得出结论,在无并发的情况下,T树的性能要优于B树,这是由于在不用加解锁的情况下,键值比较将占主要开销,而B树在查找目标结点过程中,每个结点都需要做二分查找;而T树除了最后一个结点需要做二分查找,其他的结点只需要比较最大项和最小项。在有并发控制的情况下,由于T树的树高较B树要高,在更新的时候涉及的结点较多,需要加锁的结点也较多,所以并发的性能并没有B树好。即便是乐观的访问策略,除了元数据(重整标志,当前操作计数)需要用信号量保证一致,在需要重整的时候也需要对整棵树加X锁,导致其他对树的访问不能进行,也影响了性能。
二、通过多版本实现T树并发控制
参考文献[2]提出了一种读不加锁的T树并发策略,并应用在Bell实验室的Dali内存数据库中,而参考文献[3]所介绍的ALTIBASE内存数据库也使用了类似的策略:
- 只读事务不加任何latches或locks;
- 更新事务在定位目标结点的时候是不加latches,只有在真正修改目标结点的时候才加;
- 只涉及单个结点的修改的更新操作可以并发进行;
- 由于插入导致的旋转操作可以并发执行;
下面是实现这种并发策略的方法:
- 对结点指针的读写必须是原子的;
- 对于更新事务,假设N为更新涉及的所有结点的最小子树的根结点,更新的时候先拷贝一份新的子树N’,所有的更新操作都在这个新的拷贝上进行,更新操作可以增删结点,或在结点上修改,最后原子地更新原来指向N的所有指针;
- 每个结点都有latches,整棵树也有一个latch,所有的更新操作都需要对整棵树加share latch;
- 每个结点包含一个版本bit,标志这个结点是否存在其他的版本,如果这个bit为1,则表示有新的版本拷贝链接到这个结点上,只有更新事务才需要读取和更新版本bit。当有新的键值插入到结点中或从结点中删除键值,或旋转操作涉及到该结点,才需要创建该结点的新拷贝。更新平衡因子或子节点指针不需要创建新拷贝,因为只读事务不需要读取平衡因子并且子节点指针的修改是原子的。
Any Problem: 参考文献[6]指出了使用物理多版本存在的问题,这里创建新版本会导致很多结点的拷贝,因此开销很大,在更新操作的比率上升的时候性能下降非常厉害。
三、Cache-Sensitive的T树与B树改进
对于内存索引,可以针对CPU的cache进行优化,更好的利用cache的空间局部性,减少由于缺页导致的需要从内存取数据的延迟。参考文献[6]举了SUN Enterprise 5500(400MHz) Ultra Sparc II CPU 的例子,cache hit需要8个时钟周期,而cache miss需要100个时钟周期,相差大约10倍。
3.1 CST树和CSB树
在内存数据库中使用T树时,有很多实现是在数据结点存放记录的指针,一个好处是内存数据库记录都在内存中,存指针可以节省内存。在查找结点的时候,大部分只需要比较最小项和最大项,所以可以只存最大项和最小项的键值,否则每次比较都需要通过指针去获得记录再比较键值。但是跟B树一样,页级的cache miss也是存在的,因为总是需要通过指向子结点的指针去获取子节点,并且由于T树的树高比B树要高,cache miss应该会更多。CSS树和CSB树则是将子节点存储在一段连续的空间中,父节点只需要一个指向这段空间的指针,其他子结点可以通过这个指针加上偏移量算出。但是CSB树在更新时的开销也不小[8]。
参考文献[10]提出了一种针对CPU cache优化的CST树,改进的思路类似于CSB树。虽然实验测试结果比CSB树和B+树性能都好,但是并没有考虑并发的情况,实际意义不大。
针对B树的cache效率优化的B树变种有: CSS-tree, CSB-tree, Prefetching B+-trees等,但是这些改进没有考虑有并发的情况,而现实中使用的索引通常是带有并发读写的。需要控制并发,就需要加latch,这就涉及包含latch的内存块的修改并可能导致其他CPU中的cache失效引起cache miss[6]。
从实验结果看,在满CSB树上使用这个并发策略并没有B+树好(满CSB树的更新开销比原始的CSB树要小),因为CSB树是将子节点聚集在一段连续的内存空间中,并组织成结点组,当结点分裂的时候,如果结点组不满,所有在结点组右边的结点都需要移动以给新结点腾空间;如果结点组满了,则结点组需要分裂为两个结点组。这些额外的拷贝开销,在更新很频繁的时候会导致性能下降(原始的CSB树则会在结点满的时候就引起拷贝而不是结点组满的时候)。
参考文献
[1] T. J. Lehman, M. J. Carey, “A Study of Index Structures for Main Memory Database Management Systems”, in Proceedings 12th Int. Conf. On Very Large Database, Kyoto, August 1986, pp. 294-303.
[2] R. Rastogi, S. Seshadri, P. Bohannon, D. Lieuwen, A.Silberschatz, S. Sudarshan, “Logical and physical versioning in main memory databases”, Proceedings of the Twenty-Third International Conference on Very Large Databases, Athens, Greece, 1997, pp.86-95.
[3] Kwang-Chul Jung, Kyu-Woong Lee, Hae-Young Bae, “Implementing Storage Manager in Main Memory DBMS ALTIBASE”, 2004
[4] Hongjun Lu, Yuet Yeung Ng, Zengping Tian, “T-Tree or B-Tree: Main Memory Database Index Structure Revisited”, Database Conference, 2000. ADC 2000. Proceedings. 11th Australasian
[5] Y. Sagiv, “Concurrent Operations on B-Trees with Overtaking”, Proceedings of ACM SIGACT/SIGMOD Symposium on the Principles of Database Systems, ACM, New York, 1985, pp. 28-37.
[6] Sang K. Cha, Sangyong Hwang, Kihong Kim, Keunjoo Kwon,” Cache-Conscious Concurrency Control of Main-Memory Indexes on Shared-Memory Multiprocessor Systems”, Proceedings of the 27th VLDB Conference, Roma, Italy, 2001
[7] Rudolf Bayer and Mario Schkolnick, “Concurrency of Operations on B-Trees,” Acta Informatica 9, 1977, pages 1-21.
[8] Jun Rao and Kenneth Ross, “Making B+-trees Cache Conscious in Main Memory,” In Proc. of ACM SIGMOD Conf., 2000, pages 475-486.
[9] Philip L. Lehman and S. Bing Yao, “Efficient Locking for Concurrent Operations on BTrees,” ACM TODS, Vol. 6, No. 4, 1981, pages 650-670.
[10] Ig-Hoon Lee, Sang-Goo Lee, Junho Shim, “Making T-trees Cache Conscious on Commodity Microprocessors”, JOURNAL OF INFORMATION SCIENCE AND ENGINEERING 27, 143-161 (2011)
[11] Sang K. Cha, Changbin Song, “P*TIME: highly scalable OLTP DBMS for managing update-intensive stream workload”, VLDB '04 Proceedings of the Thirtieth international conference on Very large data bases - Volume 30
本文链接:http://blog.inkernel.info/archives/19.html
特别声明:如非特别注明,否则本站文章均系原创,转载请注明出处: http://blog.inkernel.info @Ricky
posted on 2012-01-05 20:41 Swimming Fish 阅读(1514) 评论(0) 编辑 收藏 举报