ORACLE-索引

简介:索引是建立在数据库表中的一列或多列用来加速访问表中数据的辅助对象。通俗的讲,索引类似于一本书的目录或者电子书的书签。

  • 索引的优点:
     索引可以大大加快检索数据的速度。
     使用唯一性索引可以保证数据库表中每一行数据的唯一性。
     通过索引可以加快表与表之间的连接。
     在使用分组和排序子句进行数据检索时,使用索引可以显著地减少查询中分组和排序的时间。

  • 索引类型:
     单列索引:索引基于单个列所创建。
     复合索引:索引基于多个列所创建。
     B树索引:这是Oracle默认使用的索引,B树索引可以是单列索引或复合索引、唯一索引或非唯一索引、索引按B树结构组织并存放索引数据。
     位图索引:为索引列的每个取值创建一个位图,对表中的每行使用1位(bit,取值为0或1)来表示该行是否包含该位图的索引列的取值。
     函数索引:索引的取值不直接来着列,而是来着包含有列的函数或表达式。

  • 创建索引的基本原则:
     小表不需要建立索引,比如emp表只有数十行记录,可以不建立索引。
     对于大表而言,如果经常查询的记录数目少于表中总记录数目的15%,可以创建索引。这个比例并不绝对,它与全表扫描速度成正比。
     对于大部分列值不重复的列可建立索引。
     对于基数大的列适合建立B树索引,而对于基数小的列适合建立位图索引。
     对于列中有许多空值,但经常查询所有的非空值记录的列,应该建立索引。
     LONG和LONG RAW列不能创建索引。
     经常进行连接查询的列上应该创建索引。
     在使用CREATE INDEX语句创建查询时,将最常查询的列放在其他列前面。
     维护索引需要开销,特别是对表进行插入和删除操作时,因此要限制表中索引的数量。对于主要用于读的表,索引多就有好处,但是,如果一个表经常被更改,则索引应少点。
     在表中插入数据后创建索引。如果在装载数据之前创建了索引,那么当插入每行时,Oracle都必须更改每个索引。

  • 移除索引:
     索引不再需要时,应该删除以释放所占用的空间。
     索引没有经常使用,只是极少数查询会使用到该索引时。
     如果索引中包含损坏的数据块,或者是索引碎片过多时,应删除该索引,然后重建索引。
     如果表数据被移动后导致索引无效,此时应删除该索引,然后重建。
     当使用SQL*Loader给表中装载大量数据时,系统也会给表的索引增加数据,为了加快装载速度,可以在装载之前删除索引,在装载之后重新创建索引。

  • 语法:

 创建索引

CREATE INDEX idx_emp_empnoname ON emp_index(ename,empno);      -- B树索引
CREATE INDEX idx_emp_job ON emp_index(job);                       -- B树索引
CREATE BITMAP INDEX idx_emp_job_bitmap ON emp_index(ename,empno); -- 位图索引
CREATE INDEX idx_emp_name ON emp_index(UPPER(ename));            -- 函数索引

注:当创建复合索引时,索引列的顺序决定了索引的性能,通常要将最常查询的列放在前面,不常查询的列放在后面。两个具有不同名称的复合索引列,使用了相同的字段但是顺序不同是合法的。

 修改索引

ALTER INDEX idx_emp_empnoname RENAME TO idx_ename_empno;-- 重命名索引

 合并索引:合并索引不改变索引的物理组织结构,只是简单地将B树叶子节点中的存储碎片合并在一起。
 重建索引:重新创建一个新的索引,删除原来的索引。

ALTER INDEX idx_ename_empno COALESCE;-- 合并索引
ALTER INDEX idx_ename_empno REBUILD;-- 重建索引

合并索引和重建索引都能消除索引碎片,但二者在使用上有明显的区别:
 合并索引不能将索引移动到其他表空间,但重建索引可以;
 合并索引代价较低,无须额外存储空间,但重建索引恰恰相反;
 合并索引只能在B树的同一子树中合并,不改变树的高度,但重建索引重建整个B树,可能会降低树的高度。
其他:

ALTER INDEX idx_ename_empno ALLOCATE EXTENT(SIZE 200K);-- 索引扩容
ALTER INDEX idx_ename_empno DEALLOCATE UNUSED;-- 释放多余空间

 删除索引

DROP INDEX idx_ename_empno;-- 删除索引

对于唯一性索引,如果是在定义约束时由Oracle自动建立的,则可以通过使用DISABLE禁用约束或者删除约束的方法来删除对应的索引。

注:在删除表时,所有基于该表的索引也会被自动删除。

你可能感兴趣的:(数据库,oracle,数据库,database,索引)