数据结构~Sqlserver索引使用的B树

B树相关概念

在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,Kn查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;不然,必定能够肯定要查找的关键字在Ki与Ki+1之间,Pi为指向子树根节点的指针,此时取指针Pi所指的结点继续查找,直至找到,或指针Pi为空时查找失败。sql

时间复杂度

动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度数组

O(log2N)数据结构

与树的深度相关,那么下降树的深度天然会提升查找效率。sqlserver

 在SQLSERVER里的表现

咱们都知道sqlserver数据行的存储结构有两种:堆(heap)和B树(binary二叉树)。学过数据结构的人都知道,二叉树的优势是:快速使用二分法找到数据,数据页面使用双向链表首尾相连。再介绍一下数据结构中的堆(heap)。堆中的数据没有任何顺序,数据页面也不会首尾相连。那怎么在堆中查找数据呢? 堆的结构及IAM结构以下:.net

堆表只依靠表里的IAM页(索引分配映射页)将堆的页面联系在一块儿,IAM中记录了页面编号和页面位置。由此能够经过IAM扫描数据。
      1.不少书中都讲到sqlserver数据行的存储结构有两种:堆(heap)和B树(binary二叉树)。而我以为sqlserver数据页的存储结构有两种:堆(heap)和B树(binary二叉树)。
      2.数据都存在页面中,sqlserver页面有两种类型:数据页和索引页。索引页都是按照B树结构存储的。
      那么重点来了:
      无论是汇集索引,仍是非汇集索引,索引数据都存放在索引页中。
      表中若是有聚合索引,那么数据所有存储在索引页中。
      表中若是只有有非聚合索引,那么数据存在堆页(也就是实际的数据行),可是索引数据存储在索引页中。
      表中若是既有汇集索引,也有非汇集索引,那么数据和索引都存放在索引页中。
      B树结构中,每个节点就是一个页面,B树里会有一页:root page(亦便是根节点),非汇集索引和汇集索引都是同样的。
     下面开始步入正轨介绍索引:
   指针

   汇集索引:

      有人会问为何一张表只能有一个汇集索引,简单来讲由于表只能以一种顺序排列在磁盘中,因此表只能有一个汇集索引。而非汇集索引能有好几个。
      汇集索引由于数据所有存放在索引页中,因此顺着汇集索引就能够查到数据。汇集索引结构以下:server

    非汇集索引

      1.若是非汇集索引的数据放在堆表中(表示没有汇集索引),而非汇集索引的数据放在索引页中。那么非汇集索引怎么查找数据呢?在非汇集索引的叶子节点(即叶子页面)有行定位器,行定位器指向行的位置。由文件标示符、页码、行上的行数组成。整个指针称为行ID(RID)。
      2.若是非汇集索引的数据放在索引表中(表示有汇集索引),那怎么查找数据呢?则行定位器会指向汇集索引键。SQL使用非汇集索引叶子节点的指针指向的汇集索引键值,来查找数据。blog

相关文章
相关标签/搜索