oracle随笔-Index (B*树索引-1)
2013-08-31 00:56
309 查看
oracle B*Tree索引是oracle中最为常见的索引。在实际的生产系统中很多的索引就是B*Tree索引。B*Tree索引的创建有以下几个基本特点:
1.创建非唯一性索引
既然是索引肯定都是唯一定位的,但是在实际的生产中我们发现有些列并非是唯一的,但是一样可以建立索引,oracle是如何处理的呢,答案是rowid。oracle针对非唯一性索引首先按照索引键的顺序排序,然后再按照rowid升序排列追加到索引键后,使得当前的索引唯一。
2.创建唯一性索引
在一个或多个数据唯一性的列上建立索引时oracle会直接按照索引键值排序建立索引。
3.是一棵高度平衡的树,所有的叶子节点都在同一层。叶子节点以上的部分为分支节点。一颗典型的B*Tree树的数据结构如下所示
注:以上的数据结构只用一种形式定义,并非真实的oracle内部实现。
可以看出叶子节点是一个双向链表,这样设计有一个很大的好处就是oracle查询的时候在某些情况下不用每次都从根节点依次访问。例如索引区间扫描,当定位到第一个节点后直接在叶子节点上向前或向后访问即可。
以下是本次oracle随笔Index(B*Tree)系列 分析B*Tree索引的初始代码,在后面的一系列的随笔中均需要使用它们。
以上的代码执行成功后,我们就可以利用一下语句来查看索引信息了
以上的结果有一个BLEVEL的字段改字段记录的是当前的B*Tree的高度。
1.创建非唯一性索引
既然是索引肯定都是唯一定位的,但是在实际的生产中我们发现有些列并非是唯一的,但是一样可以建立索引,oracle是如何处理的呢,答案是rowid。oracle针对非唯一性索引首先按照索引键的顺序排序,然后再按照rowid升序排列追加到索引键后,使得当前的索引唯一。
2.创建唯一性索引
在一个或多个数据唯一性的列上建立索引时oracle会直接按照索引键值排序建立索引。
3.是一棵高度平衡的树,所有的叶子节点都在同一层。叶子节点以上的部分为分支节点。一颗典型的B*Tree树的数据结构如下所示
typedef struct Leaf { void* element;//节点存储的信息 struct Leaf* Head;//当前节点的前一个节点 struct Leaf* Tail;//当前节点的后一个节点 }* Leaf-pointer; typedef struct Node { void* element;//节点存储的信息 struct Node** Nodelist;//节点指向的下一级索引块 Leaf-pointer* Leaflist//指向叶子节点块集 }* Node-pointer;
注:以上的数据结构只用一种形式定义,并非真实的oracle内部实现。
可以看出叶子节点是一个双向链表,这样设计有一个很大的好处就是oracle查询的时候在某些情况下不用每次都从根节点依次访问。例如索引区间扫描,当定位到第一个节点后直接在叶子节点上向前或向后访问即可。
以下是本次oracle随笔Index(B*Tree)系列 分析B*Tree索引的初始代码,在后面的一系列的随笔中均需要使用它们。
create table T( optypenum int, recyear int, recnum int, recnumgather varchar2(20) ); alter table T add constraints t_pk primary key (optypenum,recyear,recnum) using index; CREATE INDEX T_IDX ON T(RECNUM,OPTYPENUM,RECYEAR); --initial demo data declare ioptypenum int; irecyear int; irecnum int; begin ioptypenum := 1; irecyear := 0; irecnum := 0; for ioptypenum in 1 .. 10 loop for irecyear in 2011 .. 2013 loop for irecnum in 1 .. 10000 loop insert into t (optypenum, recyear, recnum, recnumgather) values (ioptypenum, irecyear, irecnum, null); end loop; end loop; end loop; commit; update t set recnumgather = 't' || to_char(optypenum) || to_char(recyear) || to_char(recnum); commit; end;
以上的代码执行成功后,我们就可以利用一下语句来查看索引信息了
select INDEX_NAME,BLEVEL,LEAF_BLOCKS,PCT_FREE,CLUSTERING_FACTOR,NUM_ROWS from user_indexes where index_name='T_IDX'
执行后结果如下所示:
以上的结果有一个BLEVEL的字段改字段记录的是当前的B*Tree的高度。
相关文章推荐
- oracle随笔-Index (B*树索引-2)
- Oracle中查询时候使index索引失效的限制条件
- Oracle 12C高级压缩索引 Advanced Index Compression
- ORACLE invisible index/virtual index(不可见/虚拟索引)
- oracle hint 强制索引 /*+INDEX(TABLE INDEX_NAME)*/ 注意别名
- Oracle 唯一 约束(unique constraint) 与 索引(index) 关系说明
- 关于Oracle 9i 跳跃式索引扫描(Index Skip Scan)的小测试
- oracle 索引(index)
- Oracle Index 索引介绍(SQL)
- Oracle indexclustering factor 索引聚簇因子
- ORACLE虚拟索引(Virtual Index)
- Oracle 唯一 约束(unique constraint) 与 索引(index) 关系说明
- oracle INDEX索引性能测试
- Oracle Hint(提示)和INDEX(索引)的一些忠告
- 位图索引(Bitmap Index)——从B*树索引到位图索引
- Oracle 唯一 约束(unique constraint) 与 索引(index) 关系说明
- Oracle 11g新特性invisible index(不可见的索引)
- ORACLE index 随笔
- oracle TABLE ACCESS BY INDEX ROWID 你不知道的索引回表-开发系列(三)
- Oracle笔记 之 索引(index)