1. Oracle索引是一个独立于表的对象,它可以存放在与表不同的表空间中。即使索引崩溃,甚至索引删除都不会印象真正存有数据的表。
2. 为什么要引入索引:为了加快查询的速度。
3. 索引对查询语句的影响:能够加快查询速度。
4. 索引对DML语句的影响。当对表进行DML操作时,oracle服务器将自动维护基于该表的全部索引,维护方法如下:
1)当对表进行插入操作时,在对应的索引数据块中插入一行索引项;
2)当对表进行删除时,oralce服务器仅对索引项进行逻辑删除操作,即仅在所删除的索引上加一个标记,并不是真正的删除该项,只有等该块中所有的项都被删除后才真正地删除它们;
3)当对表进行删除操作时,服务器实际上对索引进行的是两个操作,一个是逻辑删除,一个是插入操作;
5. 索引的分类
1)逻辑分类
a)单列索引:基于一列的索引;
b)多列索引:基于多列的索引;
c)唯一索引:保证表中任何数据行的索引列的值都不相同;
d)非唯一索引:表中不同数据行的索引列的值可以相同;
e)基于函数的索引:利用表中的一列或多列使用函数或表达式创建的索引;
2)物理分类
a)分区或非分区索引;
b)b-树:包括正常或反转关键字索引;
c)位图索引;
6. B-树
1)B-树索引的结构
索引顶端是根节点,该结点中包含的是存有指向索引中下一级指针的项,接下来是分枝结点,分支结点中的记录存的是指向下一级的指针,最底层为叶子结点,在叶子结点存有指向表中数据行的索引项。索引项是由三部分组成:索引项头,索引列长度和值,ROWID
2)B-树索引的应用范围
适合于联机事务处理系统,因为在联机事务处理系统中DML的操作较频繁。
7.位图索引
1)位图索引的结构
位图索引也是一种B-树结构,只是位图索引的叶子结点存的不是ROWID而是每一个键值的位图。
位图索引的叶子结点包含了如下的部分:索引项头,键值,起始ROWID,终止ROWID,位图段。
2)位图索引的应用范围
适合于数据仓库系统,因为在数据仓库系统中表一般都较大但是静态的并且查询较为复杂。
8. B-树索引和位图索引的主要区别
1)对于low-cardinality的列使用位图索引要比B-树索引紧凑得多,从而节省了大量的磁盘空间,同时也就减少了I/O,从而达到了提高系统效率的效果;
2)位图索引所需要的存储空间要比B-树索引小得多,所以Oracle服务器在使用位图索引时将整个位图索引段装入内存中;
3)B-树索引对关键字的修改相对位图索引来说不算昂贵,在位图索引中修改键值列(索引列)需要使用段一级的锁,而B-树索引使用的是行一级的锁,还有在这种情况下可能要调整位图;
4)在对位图索引进行逻辑操作时,oracle服务器使用的是位操作,因此位图索引进行逻辑操作的效率是非常高的。
9.创建索引遵守的原则:
1)平衡查询和DML的需要;
2)将其放入单独的表空间,不要与表、临时段或还原段放在一个表空间,可能增减输入/输出(I/O);
3)使用同一的exten尺寸;
4)对大索引可考虑使用nologging,通过减少redo操作来提高系统的效率;
5)索引的INITRANS参数通常应该比相对应表的高;
10.创建索引
create [unique|bitmap] index [用户名.]索引名
on [用户名.]表名(列名 [asc|desc],)
[tablespace 表空间名]
[pctfree 正整型数] 在创建索引时每一个块预留的空间
[initrans 正整型数] 在每一个块中预分配的事务记录数,默认值为2
[maxrans 正整型数] 在每一个块中可以分配的事务记录数的上限
[logging|nologging]
11. 查询索引基于表、所在的表空间、索引的类型和索引的状态等信息
select index_name,table_name,tablespace_name,index_type,uniqueness,status from dba_indexes where owner='SCOTT';
2)获取用户的索引所基于的表和列的信息
select index_name,table_name,column_name,index_owner,table_name from dba_ind_columns where table_owner='SCOTT';
12. 为什么要重建索引
如果索引所基于的表上DML操作频繁(在索引所在的列),那么随着时间的推移,索引的效率可能会变得越来越差,此时就需要重建正常索引和位图索引。
13. 如何重建索引
Alter index用户名.索引名 rebuild
14. 维护索引的一些常用方法
1)在重建索引时能修改索引的一些存储参数
2)在大规模装入数据之前,为了避免索引段的自动扩展,可以使用命令手工地分配磁盘空间
3)当索引段中的磁盘空间没用时可以使用命令来回收这些空间
4)可以使用命令来合并碎片
15. 如何标识索引的使用情况
Alter index 索引名 monitoring usage;
16. 如何获取索引的使用情况
Select * from v$object_usage;
17. 如何删除索引
Drop index用户名.索引名