【Oracle】7.由B-Tree算法谈Oracle的索引

索引

1.B树索引(B-TREE)

B树索引是我们日常工作最最常用的索引,大家平时在工作中说的"索引"默认都是B树索引;

索引其实很简单,也很容易理解,用一本书的目录来形容最为贴切了,B树索引的结构跟图书馆的目录也很像。


2.B树索引的结构:

索引的顶层为根,它包括指向索引中下一层次的条目。下一层次为分支块,它又指向位于索引中下一层索引中下一层次的块,最底层的是叶节点,它包含指向表行的索引条目。叶块是双向关联的,这边与按键值升序或降序扫描索引;

3.索引叶条目的格式

一个索引条目包含以下组件:

条目头:存储列数和锁定信息

键列长度/值对:用于定义键中的列大小,后面跟随列值(此类长度/值对的数目就是索引中的最大列数)。

4.索引叶条目的特性

在非分区表的B 树索引中:

当多个行具有相同的键值时,如果不压缩索引,键值会出现重复

当某行包含的所有键列为NULL 时,该行没有对应的索引条目。因此,当WHERE 子句指定了NULL 时,将始终执行全表扫描。

5.对索引执行DML 操作的效果

对表执行DML 操作时,Oracle 服务器会维护所有索引。

下面说明对索引执行DML 命令产生的效果:

执行插入操作导致在相应块中插入索引条目。

删除一行只导致对索引条目进行逻辑删除。已删除行所占用的空间不可供后面新的叶条目使用。

更新键列导致对索引进行逻辑删除和插入。PCTFREE 设置对索引没有影响,但创建时除外。即使索引块的空间少于PCTFREE 指定的空间,也可以向索引块添加新条目。



定义

B树是一个专门的多路树尤其适合在磁盘上使用而设计的。在B树的每一节点可包含大量的密钥。其每个节点也可以包含很多子树。 B树被设计在这众多的方向的分支出来,并含有大量的密钥的每个节点,使得树的高度相对较小。这就是说,只有节点的少数必须从磁盘读取检索块。其目的是获得对数据的快速存取,和与磁盘驱动器,这意味着读出一个非常小的数量的记录。需要注意的是一个大的节点大小(有很多的节点键)也与事实有一个磁盘驱动器可以经常读数据相当数量的一次配合。


用阶定义的B树

B 树又叫平衡多路查找树。一棵m阶的B 树 (注:切勿简单的认为一棵m阶的B树是m叉树,虽然存在四叉树,八叉树,KD树,及vp/R树/R*树/R+树/X树/M树/线段树/希尔伯特R树/优先R树等空间划分树,但与B树完全不等同)的特性如下:

树中每个结点最多含有m个孩子(m>=2);

除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数);

若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);

所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null);(读者反馈@冷岳:这里有错,叶子节点只是没有孩子和指向孩子的指针,这些节点也存在,也有元素。@研究者July:其实,关键是把什么当做叶子结点,因为如红黑树中,每一个NULL指针即当做叶子结点,只是没画出来而已)。

每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
       a)   Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。 
       b)   Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。 
       c)   关键字的个数n必须满足: [ceil(m/ 2)-1]<= n <= m-1。

一棵m阶的B树满足下列条件:

1.每个结点至多有m棵子树;

2.除根节点外,其它每个分支结点至少有⌈m/2⌉棵子树;</

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值