oracle数据库对象-索引

一、索引的概念

索引类似于查字典,通过拼音、笔画,只要几步就能查到所要的字。数据库里,通过索引,只要少量的读,就能找到所需的记录。

使用索引需要找到一个平衡点,索引太多会影响DML语句的速度,因为要写索引表。索引太少又不能提高查询速度。

二、B*树索引


1、B*树索引:我们所说的“传统”的索引。create index 创建的索引默认是B*索引。

B*数索引类似于一颗二叉树,但并不是二叉树。B*树中的“B”不代表二叉(binary),而代表平衡(balanced)。

B*树的特点之一是:所有叶子块都应该在树的同一层上。

这一层也称为索引的高度(height),这说明所有从索引的根块到叶子块的遍历都会访问同样数目的块。也就是说,对于形如“SELECT INDEXED_COL FROM T WHERE INDEXED_COL = :X”的索引,要到达叶子块来获取第一行,不论使用的:X值是什么,都会执行同样数目的I/O。

换句话说,索引是高度平衡的(height balanced)。大多数B*树索引的高度都是2或者3,即使索引中有数百万行记录也是如此。这说明,一般来讲,在索引中找到一个键只需要执行2或3次I/O。

2、反向键索引

反向键索引为了缓解B*树索引中,数据集中在某些叶子块集中的问题,右侧索引问题。

通常,使用数据时(常见于批量插入操作)都比较集中在一个连续的数据范围内,那么在使用正常的索引时就很容易发生索引叶子块过热的现象,严重时将会导致系统性能下降。

使用反向索引可以分散索引键值在索引叶子块中的分布,减少热点块,提高系统性能。

语句:

create table t (x int);

create index idx_t on t(x) reverse;

加上“reverse”关键字,就创建了反向键索引。

3、降序索引

降序索引用以扩展B*树索引的功能,它允许在索引中以降序(从大到小的顺序)存储一列。

create index idx_t on t(x desc);

加上“desc”关键字,就创建了降序索引。

三、位图索引

位图索引用二进制的0、1来构建索引,在进行or操作时非常快。创建位图索引时,oracle会对整个表进行扫描,并为索引列的每个取值建立一个位图。(取值相同的列位图也相同)

当表有大量数据并且其key columns的基数(关键字不同的值)较少时,查询时常使用or等组合的where子句,对索引关键字修改较少,此时宜用位图索引。

当位图索引中key发生改变时(update),将会引起bitmap的改变,这就会对相同bitmap的所有行加锁。因为位图索引,改一条记录,会锁住所有相同值的记录,所以位图索引特别不适用于OLTP系统,如果系统中的数据会由多个并发会话频繁地更新,这种系统也不适用位图索引。

insert和普通表一样,不会锁相同值的记录,会加一个事务锁,级别比较低。

语句:

create bitmap index idx_t on t(x);

如果行中,某列不同项的个数除以行数,是一个很小的数,可能用位图索引。

读频繁的系统适合位图索引,写频繁的系统不适合位图索引。

四、函数索引

如果在某个列上频繁的使用函数,可以使用基于函数的索引。相当于对函数计算结果进行索引,查询时oracle计算出获得条件中的函数结果后,不用对每行都计算函数,加快查询速度。

create index SUBSTR_INST_DATE_IDX on tbl_n_txn(substr(inst_date,1,8));
drop index SUBSTR_INST_DATE_IDX;