oralce数据库索引

来源:互联网 发布:羽泉的唱功 知乎 编辑:程序博客网 时间:2024/06/10 01:33

例如有如下表:test_tb

id name sex rowid 1 zhangsan 0 xxxxxx1 2 limei 1 xxxxxx2 3 haungqing 0 xxxxxx3

如果在该表中不存在任何索引,那么在查询某一条记录,例如姓名为limei的人,因为查询到一个后下面不确定是否还存在姓名为limei的人,因此会进行全表扫描查询。
而如果该表的姓名字段上存在索引的情况下,那么会存在这么一张索引表:

name rowid haungqing xxxxxx3 limei xxxxxx2 ZHANGSAN xxxxxx1

该表是进行按照姓名排序后的索引表,如果查找姓名为limei的人,那么数据库会首先对name列进行快速搜索,如果找不到则可以停止搜索,如果找到,则继续向下查找,然后按照对应的ROWID在test_db表中查找到对应的记录即可。

索类分类

  1. 唯一索引和非唯一索引,唯一索引则不允许索引列值重复, 非唯一索引可以重复,一般不建议使用唯一索引,而是通过约束来控制列是否运行重复。 索引

  2. 单列索引和复合索引,顾名思义,复合索引是多列组成的索引,单列索引则仅一列 ,如果是复合索引,则经常查询的列应该在最前面,因为如果创建了C1,C2,C3三列复合索引,单独使用其中的某一列,例如仅仅查询C1或者C1和C2,则都可以通过该索引提高查询速度,但如果仅仅访问C2或者C2和C3,则无法使用该复合索引。

  3. 标准索引即B树索引,而唯一索引非唯一索引就是针对B树索引来说的

  4. 位图索引,常用于某个列基数比较小的列上,例如test_db中sex列,基数为0和1,若用B树索引的话会返回大量数据,效率会很低。

    数据库生成的位图索引表如下

男 女 rowid 1 0 xxxxxx1 0 1 xxxxxx2 1 0 xxxxx3

5. 函数索引,即在函数,例如SUBSTR()函数上创建索引,例如姓名列,如果要查询的行中姓名忽略大小写,那么如果查询条件姓名是zhangsan,那么ZHANGSAN就不会被查到,如果用UPPER(name)=‘zhangsan’来转换为
大写,则可以完成忽略大小写,但此时在name列上的索引却无法使用,因此需要创建函数索引来解决此类问题。

创建索引
CREATE [UNIQUE] |[BITMAP] INDEX index_name
ON table_name([col1 [ASC,DESC],col2[ASC,DESC]......]|[express])
[TABLESPACE tablespace_name]
[PCTFREE n1]
[STORAGE (INITIAL n2)]
[NOLOGGING]
[ONLINE]
[COMPUTE STATISTICS]
[NOSORT]

实例1,创建B树索引,即ORACLE默认索引:

create INDEX index_test_tb ON test_tb(name);

实例2,创建位图索引:

create MITMAP INDEX bindex_test_tb ON test_tb(sex);

实例3,创建函数索引(可以是B树索引或者位图索引):

create INDEX funindex_test_db on test_db ON test_db UPPER(name);

修改索引

ALTER INDEX index_name RENAME TO new_index_name;

合并索引

ALTER INDEX index_name COALESCE;

重建索引,使用REBUILD关键字

ALTER INDEX index_name REBUILD TABLESPACE tablespace_name;

删除索引

DROP INDEX index_name;
0 0
原创粉丝点击