Oracle ~ 索引种类、创建及管理

1. Oracle 索引简介

        在 Oracle 数据库中,存储的每一行数据都有一个 rowID 来标识。当 Oracle 中存储着大量的数据时,意味着有大量的 rowID ,此时想要快速定位指定的 rowID ,就需要使用索引对象。

        用户可以根据情况不同创建多种类型的索引。按照索引的存储方式将索引分为 B 树索引 位图索引 反向索引 基于函数的索引。创建索引时需要注意以下几点:当对 Oracle 表执行指定条件的查询时,常规的方法是将所有的记录取出来,然后再把每一条记录与查询条件作对比,最后返回满足条件的记录。这样操作不仅耗费时间并耗费资源。当有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的 rowID 快速找到表中对应的记录。

        用户可以根据情况不同创建多种类型的索引。按照索引的存储方式将索引分为 B 树索引、位图索引、反向索引和基于函数的索引。创建索引时需要注意以下几点:

  • 索引应该建立在 where 子句频繁引用、排序以及分组的列上,如果选择的列不合适将无法提升查询速度;
  • 限制索引的个数。索引只要提升查询速度,但会降低 DML 操作的速度;
  • 指定索引块空间的使用参数。基于表建立索引时, Oracle 会将相应表添加到索引块。为索引添加数据时, Oracle 会按照 pctfree 参数在索引块上预留部分空间。如果将来在表上执行大量的 insert 操作,那么应该在建立索引时设置较大的 pctfree ;
  • 将表和索引部署到相同的表空间,可以简化表空间的管理;将表和索引部署到不同的表空间,可以提高访问性能( Oracle 能够并行读取不同硬盘的数据);

2. 创建索引

        在创建索引时, Oracle 首先对将要建立索引的字段进行排序,然后将排序后的字段值和对应记录的 rowID 存储在索引段中。查询时,根据索引查询指定条件的 rowID ,再根据 rowID 提取数据行。

2.1 B-Tree索引

         B-Tree索引时 Oracle 最常用的索引类型(也是默认类型),是以 B-Tree结构组织并存放索引数据。默认情况下 B-Tree索引中的数据是以升序方式排列的。 B-Tree索引是由根块、分支块和叶块组成。

例:为 emp 表的 deptno 列创建索引 index _ test

Create index index_test on emp ( deptno )
  tablespace users  			--是指你创建的这个索引放在哪个表空间下面
  pctfree 10  					--是指你创建的索引至少要保留10%作为空闲空间,以便插入与删除
  initrans 2 					--支持并发操作的初始事务量
  maxtrans 255 					--支持并发操作的最大事务量
  storage
  (
    initial 64K  				--一个区得大小为64K
    next 1M
    minextents 1  				--是指初始区的个数为1个。区是oracle的最小单位,对应的就是磁盘空间
    maxextents unlimited        --这个当然就是最大区的个数无限制
  );

        其中,子句 pctfree 指定为将来 insert 操作所预留的空闲空间,子句 tablespace 指定索引段所在的表空间

2.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 ;

修改后需要重新启动数据库方可生效;

2.3 反向键索引

        在单调递增的列上使用 B 树索引时,若用户对表中数据做了删除操作,将导致对某一边的叶子节点的大量占用。 Oracle 提供另一种索引机制,及反向键索引,它可以将添加的数据随机分散到索引中。

        反向键索引是一种特殊的 B 树索引,在顺序递增数列上建立索引非常有用。反向键索引在原理和存储结构方面和 B 树索引类似。当用户插入记录时,将列值进行反向操作后进行索引,此时数据不在是递增的,所以新数据在值的范围上分布通常比原来的有序树更均匀。

反向键索引例:

Create index index _ test

On emp ( deptno ) reverse

Tablespace users ;

如果该列上已经建立了 B 树索引,那么可以将其修改为反向键索引:

Alter index index _ test

Rebulid reverse ;

2.4 基于函数的索引

        用户在使用数据库时,最常遇到的问题是大小写字符敏感。例如在 emp 表中 Job 字段有 MANAGER 的记录,当用户使用小写搜索时则无法找到该记录,只能通过函数 upper 对应进行转换,在使用转换后的数据进行检查。但是这样查询是,即便 job 列有普通索引, Oracle 也会执行全表搜索,并为遇到的各个行计算 upper 函数。这种情况可以使用建立基于函数的索引,通常只是常规 B 树索引,但是它存放的数据是由表中数据应用函数后得到的,而不是直接存放表中的数据本身。

如果习惯使用小写字符串,可以创建如下索引:

Create index index _ test

On emp ( lower ( job ));

常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:

create index idx_func on emp(UPPER(ename)) tablespace tablespace_name;

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 ’
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值