为什么要引入索引
为了加快查询的速度
索引对查询语句的影响
能够加快查询速度
索引对DML语句的影响
当对表进行DML操作时,oracle服务器将自动维护基于该表的全部索引,维护方法如下
!当对表进行插入操作时,在对应的索引数据块中插入一行索引项
!当对表进行删除时,oralce服务器仅对索引项进行逻辑删除操作,即仅在所删除的索引上加一个标记,并不是真正的删除该项,只有等该块中所有的项都被删除后才真正地删除它们
!当对表进行删除操作时,服务器实际上对索引进行的是两个操作,一个是逻辑删除,一个是插入操作
索引的逻辑分类
!单列索引
!多列索引
!唯一索引
!非唯一索引
!基于函数的索引
索引的物理分类
!分区或非分区索引
!B-树索引
!位图索引
B-树索引的结构
索引顶端是根节点,该结点中包含的是存有指向索引中下一级指针的项,接下来是分枝结点,分支结点中的记录存的是指向下一级的指针,最底层为叶子结点,在叶子结点存有指向表中数据行的索引项。索引项是由三部分组成:索引项头,索引列长度和值,ROWID
B-树索引的应用范围
适合于联机事务处理系统,因为在联机事务处理系统中DML的操作较频繁。
位图索引的结构
位图索引也是一种B-树结构,只是位图索引的叶子结点存的不是ROWID而是每一个键值的位图。
位图索引的叶子结点包含了如下的部分:索引项头,键值,起始ROWID,终止ROWID,位图段。
位图索引的应用范围
适合于数据仓库系统,因为在数据仓库系统中表一般都较大但是静态的并且查询较为复杂。
B-树索引和位图索引的主要区别
!对于low-cardinality的列使用位图索引要比B-树索引紧凑得多,从而节省了大量的磁盘空间,同时也就减少了I/O,从而达到了提高系统效率的效果
!位图索引所需要的存储空间要比B-树索引小得多,所以Oracle服务器在使用位图索引时将整个位图索引段装入内存中。
!B-树索引对关键字的修改相对位图索引来说不算昂贵,在位图索引中修改键值列(索引列)需要使用段一级的锁,而B-树索引使用的是行一级的锁,还有在这种情况下可能要调整位图。
!在对位图索引进行逻辑操作时,oracle服务器使用的是位操作,因此位图索引进行逻辑操作的效率是非常高的。
创建一个索引时应该考虑哪些问题
!平衡查询和DML的需要
!将其放入单独的表空间,不要与表,临时段,或还原段放在一个表空间中,因为索引段会与这些段竞争I/O
!使用统一的extent尺寸
!对大索引可考虑使用NOLOGGING
!索引的INITRANS参数通常应该比相对应表的高。
如何创建正常索引
Create index用户名.索引名
On 用户名.表名(列名)
如何创建位图索引
Create bitmap index 用户名.索引名
On 用户名.表名(列名)
获取索引信息的常用数据字典有哪些
Dba_indexes,dba_ind_columns
如何使用数据字典
获取用户的索引基于的表,所在的表空间,索引的类型和索引的状态等信息
Select table_name,index_name,tablespace_name,index_type,uniqueness,status from dba_indexes;
获取用户的索引所基于的表和列的信息
Select index_name,table_name,column_name,index_owner,table_owner from dba_ind_columns;
为什么要重建索引
如果索引所基于的表上DML操作频繁(在索引所在的列),那么随着时间的推移,索引的效率可能会变得越来越差,此时就需要重建正常索引和位图索引。
如何重建索引
Alter index用户名。索引名 rebuild
维护索引的一些常用方法
!在重建索引时能修改索引的一些存储参数
!在大规模装入数据之前,为了避免索引段的自动扩展,可以使用命令手工地分配磁盘空间
!当索引段中的磁盘空间没用时可以使用命令来回收这些空间
!可以使用命令来合并碎片
如何标识索引的使用情况
Alter index索引名 monitoring usage;
如何获取索引的使用情况
Select * from v$object_usage;
如何删除索引
Drop index用户名。索引名
如何确定一个索引已经被删除
Select index_name,table_name,tablespace_name,index_type,uniqueness,status
From dba_indexes;