oracle的sql优化-oracle的索引介绍原理浅析(B-Tree索引)

B 树索引(B-Tree索引

B树索引是我们在oracle数据库中最常用的索引,在详细介绍访问方法之前,我们看一下B-TREE索引的结构(图片来源网络)



         oracle的B树索引就好像一颗长到的树,他包含两种类型,一种是索引分支块(根节点块,分支节点块)一种是索引叶子块(叶子节点块)。 分节点用来搜索,叶子节点用来存储数据。根节点存储索引的低层分支节点的数据。  由于所有的叶子节点均会自动的存储成相同的深度,所以称为“平   衡树索引” ,  故此,从任何叶子处检索数据消耗的时间都是相同的

       对于分支节点块(包括根节点块)来说,其所包含的索引条目都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。每个索引条目(也可以叫做每条记录)都具有两个字段。第一个字段表示当前该分支节点块下面所链接的索引块中所包含的最小键值;第二个字段为四个字节,表示所链接的索引块的地址,该地址指向下面一个索引块。 比如从上图一可以看到,对于根节点块来说,包含三条记录,分别为(0 B1)、(500 B2)、(1000 B3),它们指向三个分支节点块。其中的0、500和1000分别表示这三个分支节点块所链接的键值的最小值。而B1、B2和B3则表示所指向的三个分支节点块的地址。在一个分支节点块中 所能容纳的记录 行数由数据块大小以及索引键值的长度决定

       对于叶子节点块来说,其所包含的索引条目与分支节点一样,都是按照顺序排列的(缺省是升序排列,也可以在创建索引时指定为降序排列)。每个索引条目(也可以叫做每条记录)也具有两个字段。第一个字段表示索引的键值,对于单列索引来说是一个值;而对于多列索引来说则是多个值组合在一起的。第二个字段表示键值所对应的记录行的ROWID,该ROWID是记录行在表里的物理地址。

       当用户创建索引时,Oracle 取得所有被索引列的数据并进行排序,之后将排序后索引值和与此值相对应的 rowid 按照从下到上的顺序加载到索引中。例如,以下语句:
CREATE INDEX employees_last_name ON employees(last_name); 
       Oracle 先将 employees 表按 last_name 列排序,再将排序后的 列及相应的 rowid 按从下到上的顺序加载到索引中。使用此索引时,Oracle 可以快速地搜索已排序的 last_name 值,并使用相应的 rowid 去定位包含用户所查找的 last_name 值的数据行。
在一个平衡树索引中,最底层的索引块(叶块)存储了被索引的数据值,以及对应的 rowid。叶块之间以双向链表的形式相互连接。位于叶块之上分支块中包含了
指向下层索引块的指针。

       接下来介绍一个索引查询的流程,从上往下,第一层为根节点,第二层为分支节点,第三层为叶子节点(包含了列值和rowid)。比如我们的条件为where=29,(补充说明如果被索引的列存储的是字符数据,那么索引值为这些字符数据在当前数据库字符集中的二进制值)就从跟节点开始查询,29在0-500中,指向分支节点最左边第一个分支节点块(也就是B1),就B1中去找,发现29在0-200中,指向叶子节点的L1,于是在L1中找到29的值和响应的rowid。如果只查找索引列的值,就不用根据rowid去表中查找了,如果还要查找值29这行的其他列的值就得根据rowid去表里查查询(这个过程叫做回表查询)。叶子节点还有个双向链表(如图)。在通过索引进行范围扫描时会起作用,比如要查找值29-700,如果当查找到值29的时候,不就会再从跟节点开始查找其他的值,而是根据本叶子节点链表的指向去查找其他的值。


参考文章http://blog.csdn.net/zhifeiyu2008/article/details/8309889

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值