Oracle中的索引

2015-03-04 17:08:27 · 作者: · 浏览: 55

Oracle中的索引

1. 索引概述

在关系数据库中,索引是一种与表有关的数据库结构,它是除表以外的另一个重要模式对象。索引是建立在表的一列或多个列上的辅助对象,目的是提高表中数据的访问速度。

索引时表示数据的另一种方式,它提供的数据顺序不同于数据在磁盘上的物理存储顺序。它重新排列数据的物理位置,使其值为有序键值列表,每个键值是指向表行的指针,故其排列方式使其搜索变得更加有效。

Oracle中常用的索引类型有:B树索引、反向键索引、位图索引、基于函数的索引、簇索引、全局索引和局部索引。

创建索引的语法如下:

    CREATE UNIQUE|BTIMAP INDEX .
    ON .
    (| ASC|DESC,
    | ASC|DESC,...
    )
    TABLESPACE 
    STORAGE 
    LOGGING|NOLOGGING
    COMPUTE STATISTICS
    NOCOMPRESS|COMPRESS 
    NOSORT|REVERSE
    PATITION|GLOBAL PATITION ;

2. B树索引

B树索引是Oracle中默认并且最常用的索引,B树索引的组织结构类似一棵树,其中主要数据集中在叶子结点上,每个叶子结点中包括:索引列的值和记录行对应的物理地址ROWID。

创建B树索引

创建一个B数索引,需要使用CREATE INDEX语句,如果用户要在自己的模式中创建索引,则必须具有CREATE INDEX的系统权限:如果用户想要在其他用户模式中创建索引,则必须具有CREATE ANY INDEX的系统权限。

1. 创建普通索引

创建索引时,在ON关键字后面指定索引引用的表名和列名,使用TABLESPACE指定存储索引的表空间。
默认情况下,当用户为表定义一个主键时 系统将自动为该列创建一个B树索引,另外,当一个列已经包含索引时,则无法再在该列上创建索引。

例1:

CREATE UNIQUE INDEX sname_index ON siege.student sname)TABLESPACE learning;

2. 创建唯一索引

索引可以是唯一的,也可以是不唯一的,唯一的B树索引可以保证索引列上不会有重复的值。创建唯一索引需要使用关键字UNIQUE。

例2:

DROP INDEX sname_index; 
CREATE UNIQUE INDEX sname_index ON siege.student (sname)TABLESPACE learning;

注:每列只能创建一个索引,索引先删除之前的索引再来创建唯一索引。

3. 创建复合索引

复合索引,是指基于表中多个字段的索引。

例3:

DROP INDEX sname_index ;
CREATE  INDEX sname_index ON siege.student (sname,sage)TABLESPACE learning;

3. 位图索引

位图索引不同于B树索引,它不存储ROWID值,也不存储键值,主要用于在比较特殊的列上创建索引。

当列的技术很低时(指在索引列中,所有列值的数量比表中行的数量少,例如’性别‘列只有2个值)。Oracle建议,当一个列的所有取值数量与行的总数比小于1%时,对该列就不再适合建立B树索引,而适用位图索引。

1. 创建位图索引

位图索引适用于在表中基数比较小的列上创建,在表上放置单独的位图索引没有意义,只有对多个列建立位图索引,系统才可以有效地利用它们来提高查询的速度。

位图所以不是能使唯一索引,也不能进行键压缩,位图索引的作用来源于与其他位图索引的结合,当在多个列上进行查询,Oracle对这些列上的位图进行布尔AND和OR运算,最终找到需要的结果。

先修改student表结构,增加ssex字段,并赋值:

ALTER TABLE student  ADD (ssex Varchar2(1));
UPDATE student SET ssex='M'

然后对ssex列创建位图索引:

例4:

CREATE BITMAP INDEX ssex_bitmap_index on siege.student(ssex) TABLESPACE learning;

注:由于本机器安装的是XE版的Oracle,在执行下列语句时Bit-mapped indexes=FALSE,说明未安装此功能,故上面的语句执行会报00439错误,不过正常情况下应是正确的。

select * from v$option   Where  PARAMETER='Bit-mapped indexes'

4. 反向键索引

反向键索引时一种特殊的B树索引,适用于在含有序列数的列上创建索引,在常规的B树索引中,如果主键是递增的,那么在向表中添加新的数据时,B数索引将直接访问最后一个数据,而不是一个结点一个结点的访问,这种情况造成的结果是:随着数据行的增加,以及原有数据行的删除,B树索引将变得越来越不均匀。

此时,可以创建反向键索引,其原理是:如果用户使用序列编号在表中添加新的记录,则反向键索引首先反向转化每个列键值的字节,然后在反向后的新数据上进行索引。

例如,如果用户输入索引键2009,则反向键索引将其反向转化为9002, 这样可以将索引键变成非递增的,从而使得数据在值的范围分布上比原来更均匀。

反向键索引适用于在表中严格排序的列上创建,在查询时,用户只需要像常规方式一样查询数据,而不需要关心键的反向处理,系统会自动完成该处理。

例5:

CREATE  INDEX sid_reserve_index on siege.student(sid)  REVERSE TABLESPACE learning;