您的位置:首页 > 数据库 > Oracle

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树的数据结构如下所示

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 索引