`
sdustyongz
  • 浏览: 86155 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入研究B树索引

 
阅读更多
转自:http://blog.itpub.net/9842/viewspace-312607

摘要:本文对B树索引的结构、内部管理等方面做了一个全面的介绍。同时深入探讨了一些与B树索引有关的广为流传的说法,比如删除记录对索引的影响,定期重建索引能解决许多性能问题等。
1.B树索引的相关概念
索引与表一样,也属于段(segment)的一种。里面存放了用户的数据,跟表一样需要占用磁盘空间。只
不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样。在理解索引时,可以想象一本书,其中书的内容就相当于表里的数据,而书前面的目录就相当于该表的索引。同时,通常情况下,索引所占用的磁盘空间要比表要小的多,其主要作用是为了加快对数据的搜索速度,也可以用来保证数据的唯一性。
       但是,索引作为一种可选的数据结构,你可以选择为某个表里的创建索引,也可以不创建。这是因为一旦创建了索引,就意味着oracle对表进行DML(包括INSERT、UPDATE、DELETE)时,必须处理额外的工作量(也就是对索引结构的维护)以及存储方面的开销。所以创建索引时,需要考虑创建索引所带来的查询性能方面的提高,与引起的额外的开销相比,是否值得。
       从物理上说,索引通常可以分为:分区和非分区索引、常规B树索引、位图(bitmap)索引、翻转(reverse)索引等。其中,B树索引属于最常见的索引,由于我们的这篇文章主要就是对B树索引所做的探讨,因此下面只要说到索引,都是指B树索引。
       B树索引是一个典型的树结构,其包含的组件主要是:
1)      叶子节点(Leaf node):包含条目直接指向表里的数据行。
2)      分支节点(Branch node):包含的条目指向索引里其他的分支节点或者是叶子节点。
3)      根节点(Root node):一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点。
可以用下图一来描述B树索引的结构。其中,B表示分支节点,而L表示叶子节点。

对于分支节点块(包括根节点块)来说,其所包含的索引条目都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。每个索引条目(也可以叫做每条记录)都具有两个字段。第一个字段表示当前该分支节点块下面所链接的索引块中所包含的最小键值;第二个字段为四个字节,表示所链接的索引块的地址,该地址指向下面一个索引块。在一个分支节点块中所能容纳的记录行数由数据块大小以及索引键值的长度决定。比如从上图一可以看到,对于根节点块来说,包含三条记录,分别为(0 B1)、(500 B2)、(1000 B3),它们指向三个分支节点块。其中的0、500和1000分别表示这三个分支节点块所链接的键值的最小值。而B1、B2和B3则表示所指向的三个分支节点块的地址。
       对于叶子节点块来说,其所包含的索引条目与分支节点一样,都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。每个索引条目(也可以叫做每条记录)也具有两个字段。第一个字段表示索引的键值,对于单列索引来说是一个值;而对于多列索引来说则是多个值组合在一起的。第二个字段表示键值所对应的记录行的ROWID,该ROWID是记录行在表里的物理地址。如果索引是创建在非分区表上或者索引是分区表上的本地索引的话,则该ROWID占用6个字节;如果索引是创建在分区表上的全局索引的话,则该ROWID占用10个字节。
       知道这些信息以后,我们可以举个例子来说明如何估算每个索引能够包含多少条目,以及对于表来说,所产生的索引大约多大。对于每个索引块来说,缺省的PCTFREE为10%,也就是说最多只能使用其中的90%。同时9i以后,这90%中也不可能用尽,只能使用其中的87%左右。也就是说,8KB的数据块中能够实际用来存放索引数据的空间大约为6488(8192×90%×88%)个字节。
       假设我们有一个非分区表,表名为warecountd,其数据行数为130万行。该表中有一个列,列名为goodid,其类型为char(8),那么也就是说该goodid的长度为固定值:8。同时在该列上创建了一个B树索引。
在叶子节点中,每个索引条目都会在数据块中占一行空间。每一行用2到3个字节作为行头,行头用来存放标记以及锁定类型等信息。同时,在第一个表示索引的键值的字段中,每一个索引列都有1个字节表示数据长度,后面则是该列具体的值。那么对于本例来说,在叶子节点中的一行所包含的数据大致如下图二所示:


从上图可以看到,在本例的叶子节点中,一个索引条目占18个字节。同时我们知道8KB的数据块中真正可以用来存放索引条目的空间为6488字节,那么在本例中,一个数据块中大约可以放360(6488/18)个索引条目。而对于我们表中的130万条记录来说,则需要大约3611(1300000/360)个叶子节点块。
       而对于分支节点里的一个条目(一行)来说,由于它只需保存所链接的其他索引块的地址即可,而不需要保存具体的数据行在哪里,因此它所占用的空间要比叶子节点要少。分支节点的一行中所存放的所链接的最小键值所需空间与上面所描述的叶子节点相同;而存放的索引块的地址只需要4个字节,比叶子节点中所存放的ROWID少了2个字节,少的这2个字节也就是ROWID中用来描述在数据块中的行号所需的空间。因此,本例中在分支节点中的一行所包含的数据大致如下图三所示:

从上图可以看到,在本例的分支节点中,一个索引条目占16个字节。根据上面叶子节点相同的方式,我们可以知道一个分支索引块可以存放大约405(6488/16)个索引条目。而对于我们所需要的3611个叶子节点来说,则总共需要大约9个分支索引块。
       这样,我们就知道了我们的这个索引有2层,第一层为1个根节点,第二层为9个分支节点,而叶子节点数为3611个,所指向的表的行数为1300000行。但是要注意,在oracle的索引中,层级号是倒过来的,也就是说假设某个索引有N层,则根节点的层级号为N,而根节点下一层的分支节点的层级号为N-1,依此类推。对本例来说,9个分支节点所在的层级号为1,而根节点所在的层级号为2。
分享到:
评论

相关推荐

    【转】深入研究B树索引

    **深入研究B树索引** B树(B-tree)是一种自平衡的树数据结构,广泛应用于数据库和文件系统中,特别是在实现索引存储时。它能够保持数据有序,允许快速查找、插入和删除操作。本篇文章将深入探讨B树的核心概念、...

    深入研究B树索引.doc

    原文转载自...本文对B树索引的结构、内部管理等方面做了一个全面的介绍。同时深入探讨了一些与B树索引有关的广为流传的说法,比如删除记录对索引的影响,定期重建索引能解决许多性能问题等。

    B树索引和自创Connect.rar

    总的来说,B树索引和自创Connect都是为了提升数据检索的效率。理解它们的原理和特点,有助于我们设计更高效的数据库系统,并在实际项目中选择最适合的数据结构。通过源码分享,我们可以深入研究这些数据结构的实现,...

    Oracle B*树索引内部机制及其应用的研究.pdf

    B*树(B-star tree)是B树的一个变种,它在B树的基础上进行了优化,以适应大规模数据存储和高效查询的需求。 B*树索引的核心特点在于它的分层结构,每个节点可以包含多个子节点,并且每个节点可以存储多个键值和...

    cpp-DeepDataBase是一个使用B树索引实现的关系数据库引擎

    cpp-DeepDataBase是一个使用B树索引实现的关系数据库引擎,它的设计目标是提供一个轻量级、高效的数据库解决方案。DeepDataBase是用C++编程语言编写的,这意味着它利用了面向对象的特性,同时保持了较低级别的性能...

    空间索引技术-R树 及其研究

    R树是由Guttman在1984年提出的一种多维索引结构,它是对B树的扩展,用于存储和查询具有空间属性的数据。R树的主要目标是在多维空间中有效地组织和检索数据,通过构建一种平衡的树形结构来降低搜索成本。 在R树中,...

    B-树 B+树 源代码 C++ 数据结构

    为了更好地理解这些数据结构,可以先从B-树入手,熟悉其基本原理和操作流程,然后再研究B+树的差异。项目提供的源代码可以作为实践平台,通过阅读和调试代码,加深对B-树和B+树的理解。 总结来说,这个C++实现的B-...

    b树建立的例子

    **B树(B-tree)**是一种自平衡的查找树数据结构,它能够保持数据排序,适合用于数据库和文件系统等领域。...对于给定的压缩文件“bplustree”,可能包含了B树或B+树的示例代码和相关工具,供学习者深入研究和实践。

    b+b-树c语言版

    总结,这个压缩包提供了一个学习和研究B+树的良好平台,对于理解数据结构和算法,以及提高C语言编程技能都非常有价值。通过分析和实践其中的代码,你可以掌握B+树的基本操作,并了解到如何在实际项目中优化数据访问...

    基于Oracle数据库索引的查询优化研究.pdf

    B树索引是最常见的索引类型,基于二叉树原理,分支块相当于大目录,页块则指向具体的记录,确保了快速的数据访问。默认情况下,Oracle创建的索引多为B树索引。 2.2 反向索引 反向索引将索引值反转存储,用于保持...

    行业-64 深入研究索引之前,先来看看磁盘数据页的存储结构l.rar

    在堆表中,数据按照插入顺序无序地存储在数据页上,而B树(B+树)是一种自平衡的多路查找树,广泛用于数据库的索引结构,确保数据的快速查找。B树的每个节点都包含若干个键值和指向子节点的指针,通过键值比较,可以...

    MySQL数据库中关于索引的研究.pdf

    MySQL中的索引基于数据结构,如B树和B+树。B树是一种多叉平衡查找树,其特点是每个节点最多有m个子节点,且非叶子节点至少包含[ceil(m/2)]个孩子。B+树是B树的变种,它的每个非叶子节点包含k个关键码,所有的数据都...

    索引调整优化Oracle 9i工作性能的研究.pdf

    Oracle提供了多种类型的索引,如B树索引、位图索引等。DBA_INDEXES视图可以显示所有索引的信息,而USER_INDEXES视图则专门用于查看特定模式的索引。通过USER_INDEXES和USER_INDEX_COLUMNS视图,我们可以获取索引的...

    B-树源码及报告文档

    源码提供了直观的实现细节,注释有助于理解代码逻辑,报告文档和PPT则可能包含理论介绍、算法分析以及性能评估等内容,对于学习和研究B-树有着极大的帮助。 通过学习和实践B-树的实现,开发者可以掌握一种高效的...

    Modern B-Tree Techniques

    《现代B-树技术》是一篇深入探讨B-树数据结构及其在数据库应用中的最新技术的文章。B-树是一种自平衡的查找树,特别适合用于大型数据库和文件系统的索引存储。本文由Goetz Graefe撰写,详细阐述了B-树的基本原理、...

    多核处理器环境下内存数据库索引性能分析.pdf

    总的来说,《多核处理器环境下内存数据库索引性能分析》深入研究了多核环境下内存数据库索引的性能挑战和优化策略,为数据库系统的设计者和研究人员提供了宝贵的参考。通过对经典索引结构的实验测试和性能分析,该...

    红黑树,b树及其他数据结构源代码

    本资源包含了一些最常用且重要的数据结构的源代码实现,如红黑树(Red-Black Tree)和B树(B-Tree)。下面将详细讨论这两个数据结构以及堆排序的概念。 1. **红黑树**: 红黑树是一种自平衡二叉查找树,由Rudolf ...

    算法-理论基础- 索引- 分块索引(包含源程序).rar

    2. 索引结构:可以选择B树、B+树、哈希索引等不同类型的索引来实现分块索引,每种结构都有其适用场景和优缺点。 3. 数据分布:理解数据的分布特性有助于选择合适的分块策略,例如,如果数据按时间顺序分布,可以按照...

Global site tag (gtag.js) - Google Analytics