1.1 索引的定义
索引类似与书的目录结构,可以根据目录中的页码快速找到需要的内容。
索引是一个单独的、物理的数据库结构,它是某个表中一列或者几列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。使用索引可以快速访问数据库表中的特定信息。
Oracle自动维护索引,插入、删除、更新表中数据时,自动更新索引。
1.2 索引的分类
1.2.1 唯一索引
当建立PrimaryKey(主键)或者Unique constraint(唯一约束)时,唯一索引将被自动建立。顾名思义,建立唯一索引的字段上不能存在两个或两个以上的相同的值。
1.2.2 B树索引(默认类型)
B树索引在Oracle中是一个通用索引。在创建索引时它就是默认的索引类型。B树索引可以是一个列的(简单)索引,也可以是组合/复合(多个列)的索引。B树索引最多可以包括32列。
B树索引的存储示意图如下:
树叶块包含了索引值、ROWID,以及指向前一个和后一个树叶块的指针。Oracle可以从两个方向遍历这个二叉树。B树索引保存了在索引列上有值的每个数据行的ROWID值。Oracle不会对索引列上包含NULL值的行进行索引。如果索引是多个列的组合索引,而其中列上包含NULL值,这一行就会处于包含NULL值的索引列中,且将被处理为空(视为NULL)。
索引列的值都存储在索引中。因此,可以建立一个组合(复合)索引,这些索引可以直接满足查询,而不用访问表。这就不用从表中检索数据,从而减少了I/O量。
1.2.3 位图索引
位图索引非常适合于联机分析处理 OLAP,它们不应该用于通过事务处理应用程序访问的表。它们可以使用较少到中等基数(不同值的数量)的列访问非常大的表。尽管位图索引最多可达30个列,但通常它们都只用于少量的列。
例如,您的表可能包含一个称为Sex的列,它有两个可能值:男和女。这个基数只为2,如果用户频繁地根据Sex列的值查询该表,这就是位图索引的基列。当一个表内包含了多个位图索引时,您可以体会到位图索引的真正威力。如果有多个可用的位图索引,Oracle就可以合并从每个位图索引得到的结果集,快速删除不必要的数据。
Bitmapt特点:
适合与决策支持系统;
做UPDATE代价非常高;
非常适合OR操作符的查询;
基数比较少的时候才能建位图索引;
技巧:对于有较低基数的列需要使用位图索引。性别列就是这样一个例子,它有两个可能值:男或女(基数仅为2)。位图对于低基数(少量的不同值)列来说非常快,这是因为索引的尺寸相对于B树索引来说小了很多。因为这些索引是低基数的B树索引,所以非常小,因此您可以经常检索表中超过半数的行,并且仍使用位图索引。
当大多数条目不会向位图添加新的值时,位图索引在批处理(单用户)操作中加载表(插入操作)方面通常要比B树做得好。当多个会话同时向表中插入行时不应该使用位图索引,在大多数事务处理应用程序中都会发生这种情况。
1.3 索引的查询
SELECT * FROM USER_INDEXES WHEREINDEX_NAME=‘INDEX_NAME‘
1.4 索引的创建
索引的创建语法:
CREATE UNIUQE | BITMAP |NORMAL INDEX<schema>.<index_name>
ON <schema>.<table_name>
(<column_name> | <expression> ASC | DESC,<column_name>| <expression> ASC | DESC,...)
TABLESPACE <tablespace_name>
STORAGE <storage_settings>
LOGGING | NOLOGGING
COMPUTE STATISTICS
NOCOMPRESS | COMPRESS<nn>
NOSORT | REVERSE
PARTITION | GLOBAL PARTITION<partition_setting>
INVISIBLE | VISIBLE
其中:
-
UNIQUE | BITMAP |NORMAL:指定 UNIQUE为唯一值索引,BITMAP 为位图索引,NORMAL可以省略,为 B-Tree索引。
-
Schema:ORACLE模式,缺省即为当前帐户。
-
Index name:索引名。
-
Table_name:创建索引的基表名。
-
<column_name>|<expression>ASC|DESC:可以对多列进行联合索引,当为expression时即―基于函数的索引。long列、long raw列不能建索引列。
-
TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)。
-
STORAGE:可进一步设置表空间的存储参数 。
-
LOGGING|NOLOGGING:是否对索引产生重做日志(对大表尽量使用 NOLOGGING来减少占用空间并提高效率)。
-
COMPUTE STATISTICS:创建新索引时收集统计信息。
-
NOCOMPRESS|COMPRESS<nn>:是否使用―键压缩‖(使用键压缩可以删除一个键列中出现的重复值)。
-
NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值。
-
PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区。
-
INVISIBLE| VISIBLE:在Oracle 11g里新增的新的特性来索引不可见(Index Invisible),当索引被设为不可见后,实际上就是指该索引对于优化器不可见,但是不影响正常的更新。
例如:
createindex INX_PST_SCHEMEIDon PM_SCHEME_ITEM_FLAT(RPT_SCHEME_ID, YEAR_MON)
tablespace EDMDATA2
pctfree10
initrans2
maxtrans255
storage
(
initial64K
next1M
minextents1
maxextentsunlimited
)
compress visible;
1.5 索引的修改
索引修改的语法:
ALTER [UNIQUE] INDEX <schema>.<indexname>
[INITRANS n]
[MAXTRANS n]
REBUILD
[STORAGE n]
其中:
REBUILD是 根据原来的索引结构重新建立索引,实际是删除原来的索引后再重新建立。
提示:DBA经常用 REBUILD来重建索引可以减少硬盘碎片和提高应用系统的性能。
1.6 索引的删除
当不需要时可以将索引删除以释放出硬盘空间。命令如下:
DROP INDEX [schema.]indexname
例如:
SQL>DROP INDEX INX_PST_SCHEMEID;
Index dropped
注:当表结构被删除时,有其相关的所有索引也随之被删除。