Oracle索引

索引是什么?

    索引是与表关联的可选结构,是一种快速访问数据的途径,可提高数据库性能。

    数据库可以明确地创建索引,以加快对表执行SQL语句的速度。

    当索引键作为查询条件时,该索引将直接指向包含这些值得行的位置。即便删除索引,也无需修改任何SQL语句的定义。

关于索引的一些原则

     创建索引需要遵循的一些原则:

        1) 频繁搜索的列可以作为索引。

        2) 经常排序、分组的列可作为索引。

        3) 经常用作连接的列(主键/外键)可作为索引。

        4) 将索引放在一个单独的表空间中,不要放在有回退段、临时段和表的表空间中。

        5) 对大型索引而言,考虑使用nologging字句创建大型索引。

        6) 根据业务数据发生的频率,定期重新生成或重新组织索引,并进行碎片整理。

        7) 仅包含几个不同值的列不可以创建为B数索引,可根据需要创建位图索引。

        8) 不要在仅包含几行的表中创建索引。

    删除索引需要遵循的一些原则:

        1) 应用程序不再需要索引。

        2) 执行批量添加前。大量添加数据前删除索引,可以调添加速度和更搞笑的使用索引空间。

        3) 索引已损坏。

    重建索引需要遵循的一些原则:

        1) 用户表被移动到新的表空间后,表上的索引不会自动转义,此时需要将索引移动到指定表空间。

        2) 索引中包含很多已删除的向。对表进行频繁删除,造成索引空间浪费,可以重建索引。

        3) 需将现有的正常索引转换成反向键索引。

B树索引

     B树索引也称为标准索引。索引的顶部为根,其中包含指向索引中下一级的项。下一级为分支块,分支块又指向索引中下一级的块。最低一级为叶节点,

    其中包含指向表行的索引项。叶块为双向链接,有助于按关键字值的升序和降序扫描索引。

唯一索引和非唯一索引

     唯一索引:

        定义索引的列中任何两行都没有重复值。唯一索引中的索引关键字只能指向表中的一行。在创建主键约束和创建唯一约束时都会创建一个与之对

        应的唯一索引。

    非唯一索引:

        单个关键字可以有多个与其关联的行。

反向键索引

     与常规B树索引相反,反向键索引在保持列顺序的同事反转索引列的字节。反向键索引通过反转索引键的数据值来实现。其优点是对于连续增长的索引列,

    反转索引列可以将索引数据分散在多个索引块间,减少I/O瓶颈的发生。

    反向键索引通常建立在一些值连续增长的列上,如系统生成的员工编号,但不能执行范围搜索。

位图索引

    位图索引的有点在于,它最适用于低基数列(即该列的值是有限的,理论上不会是无穷大)。

    位图索引具有下列有点。

        1.对于大批即时查询,可以减少相应时间。

        2.相比其他索引计数,占用空间明显减少。

        3.即使在配置很低的终端硬件上,也能获得显著的性能。

    位图索引不应当用在频繁发生insert、update、delete操作的表上。这些DML操作在性能方面的代价很高。位图索引最适合用于数据仓库和决策支持系统。

组合索引

     在表内多列上创建。索引中的列不必与表中的列顺序一致,也不必相互邻接,类似于SQL server中的复合索引。

    组合索引最多包含32列。

基于函数的索引

     若使用的函数或表达式涉及正在建立索引的表中的一列或多列,则创建基于函数的索引。可以将基于函数的索引创建为B树索引或位图索引。


关于索引的一些例子

/*
===========================================================
| 在薪水级别(salgrade)表中,为级别编号(grade)列创建唯一索引
============================================================
*/

CREATE UNIQUE INDEX index_unique_grade ON salgrade(grade);

/*
===========================================================
| 在员工(employee)表中,为员工编号(empno)列创建反向键索引
============================================================
*/
CREATE INDEX index_reverse_empno ON employee(empno) REVERSE;
/*
===========================================================
| 在员工(employee)表中,为工种(job)列创建位图索引
============================================================
*/

CREATE BITMAP INDEX index_bit_job ON employee(job);
/*
===========================================================
| 在员工(employee)表中,为员工名称(ename)列创建大写函数索引
============================================================
*/
CREATE INDEX index_ename ON employee(UPPER(ename));

/*
===========================================================
| 主键列创建反向键索引
============================================================
*/
CREATE UNIQUE INDEX idx_empno ON employee(empno) REVERSE;

--删除索引
DROP INDEX index_bit_job;

--将反向键索引更改为正常B树索引
ALTER INDEX index_reverse_empno REBUILD NOREVERSE;

--将索引移到指定表空间
ALTER INDEX index_name REBUILD TABLESPACE tablespace_name;

--创建B树索引
CREATE INDEX idx_emp_department
ON employee(deptno);

--创建位图索引
CREATE BITMAP INDEX idx_emp_job
ON employee(job);

--创建组合索引
CREATE INDEX idx_emp_name
ON employee(last_name,first_name);

-- 主键列创建反向键索引
CREATE UNIQUE INDEX idx_empno ON employee(empno) REVERSE;

原文地址:https://www.cnblogs.com/gaofei-1/p/7450272.html