Oracle
索引创建及管理
1.
Oracle
索引简介
在
Oracle
数据库中,存储的每一行数据都有一个
rowID
来标识。当
Oracle
中存储着大量的数据时,意味着有大量的
rowID
,此时想要快速定位指定的
rowID
,就需要使用索引对象。
当对
Oracle
表执行指定条件的查询时,常规的方法是将所有的记录取出来,然后再把每一条记录与查询条件作对比,最后返回满足条件的记录。这样操作不仅耗费时间并耗费资源。当有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的
rowID
快速找到表中对应的记录。
用户可以根据情况不同创建多种类型的索引。按照索引的存储方式将索引分为
B
树索引、位图索引、反向索引和基于函数的索引。创建索引时需要注意以下几点:
l
索引应该建立在
where
子句频繁引用、排序以及分组的列上,如果选择的列不合适将无法提升查询速度;
l
限制索引的个数。索引只要提升查询速度,但会降低
DML
操作的速度;
l
指定索引块空间的使用参数。基于表建立索引时,
Oracle
会将相应表添加到索引块。为索引添加数据时,
Oracle
会按照
pctfree
参数在索引块上预留部分空间。如果将来在表上执行大量的
insert
操作,那么应该在建立索引时设置较大的
pctfree
;
l
将表和索引部署到相同的表空间,可以简化表空间的管理;将表和索引部署到不同的表空间,可以提高访问性能(
Oracle
能够并行读取不同硬盘的数据);
2.
创建索引
在创建索引时,
Oracle
首先对将要简历索引的字段进行排序,然后将排序后的字段值和对应记录的
rowID
存储在索引段中。查询时,根据索引查询指定条件的
rowID
,再根据
rowID
提取数据行。
1)
B
树索引
B
树索引时
Oracle
最常用的索引类型(也是默认类型),是以
B
树结构组织并存放索引数据。默认情况下
B
树索引中的数据是以升序方式排列的。
B
树索引是由根块、分支块和叶块组成。
例:为
emp
表的
deptno
列创建索引
index
_
test
Create
index
index
_
test
on
emp
(
deptno
)
Pctfree
25
Tablespace
users
;
其中,子句
pctfree
指定为将来
insert
操作所预留的空闲空间,子句
tablespace
指定索引段所在的表空间
2) 位图索引
当需创建索引列包含的取值太少时,如对性别列创建索引,取值只能是“男”或者“女”,使用
B
树索引取出来的值任然太多,失去了索引的意义。这种情况需要使用位数索引,
例:
Create
bitmap
index
index
_
test
On
emp
(
salary
)
Tablespace
users
;
注:初始化参数
create
_
bitmap
_
area
_
size
用于指定建立位图索引时分配的位图区大小,默认值为8
MB
,该参数越大建立位图索引的速度越快。修改该参数语句为:
Alter
system
set
create
_
bitmap
_
area
_
size
=8388608
Scope
=
spfile
;
修改后需要重新启动数据库方可生效;
3) 反向键索引
在单调递增的列上使用
B
树索引时,若用户对表中数据做了删除操作,将导致对某一边的叶子节点的大量占用。
Oracle
提供另一种索引机制,及反向键索引,它可以将添加的数据随机分散到索引中。反向键索引是一种特殊的
B
树索引,在顺序递增数列上建立索引非常有用。反向键索引在原理和存储结构方面和
B
树索引类似。当用户插入记录时,将列值进行反向操作后进行索引,此时数据不在是递增的,所以新数据在值的范围上分布通常比原来的有序树更均匀。
例:
Create
index
index
_
test
On
emp
(
deptno
)
reverse
Tablespace
users
;
如果该列上已经建立了
B
树索引,那么可以将其修改为反向键索引:
Alter
index
index
_
test
Rebulid
reverse
;’
4) 基于函数的索引
用户在使用数据库时,最常遇到的问题是大小写字符敏感。例如在
emp
表中
Job
字段有
MANAGER
的记录,当用户使用小写搜索时则无法找到该记录,只能通过函数
upper
对应进行转换,在使用转换后的数据进行检查。但是这样查询是,即便
job
列有普通索引,
Oracle
也会执行全表搜索,并为遇到的各个行计算
upper
函数。这种情况可以使用建立基于函数的索引,通常只是常规
B
树索引,但是它存放的数据是由表中数据应用函数后得到的,而不是直接存放表中的数据本身。
如果习惯使用小写字符串,可以创建如下索引:
Create
index
index
_
test
On
emp
(
lower
(
job
));
3.
修改索引
修改索引使用
alter
index
完成。
为表建立索引后,随着对表不断进行更替、插入和删除动作,索引中国会产生越来越多的存储碎片,导致索引工作效率降低。这是可以采取重建索引和合并索引清除碎片。合并索引只是将
B
树中叶子节点的存储碎片合并在一起,并不会改变索引的物流组织结构。
合并索引:
Alter
index
index
_
test
Coalesce
deallocate
unused
;
重建索引:
Alter
index
index
_
test
rebuild
Tablespace
user
1;
重建索引时可以更改索引的类型,存储表空间等
4.
删除索引
删除索引使用
drop
index
语句。当索引过于碎片化,或者不经常被用到时,既可以删除索引:
Drop
index
index
_
test
;
注:删除表是也会删除其相应的索引。
5.
显示索引信息
为了显示索引的信息,
Oracle
提供了一系列数据字典视图,使用户了解索引的各方面信息。
1) 显示表的所有索引:显示
emp
的所有索引
Select
*
from
dba
_
indexs
where
owner
=’
EMP
’
2) 显示索引列:显示
index
_
test
所使用的索引列:
Select
*
from
user
_
ind
_
columns
where
index
_
name
=’
INDEX
_
TEST
’
3) 显示索引位置及大小
Select
*
from
user
_
segments
where
segment
_
name
=’
INDEX
_
TEST
’
4) 显示函数索引
Select
*
from
user
_
ind
_
expressions
where
index
_
name
=’
INDEX
_
TEST
’