Oracle中的索引非常多,也非常复杂,但是对于oracle的开发人员和系统管理员来说,索引至关重要,因为使用了恰当的索引,将会大大提高数据库的访问性能,否则就有可能使系统处于泥潭当中,不能自拔。这篇文章只是自己的总结,不可能对oracle当中的所有索引都进行剖析(也没有这个能力^_^),希望能对你有所帮助。
1. 什么是索引?为什么要引用索引?
对于查询操作,oracle的任务是根据用户提供的查询条件尽快地查找到一个目的rowid集合,oracle根据这个rowid集合获取最终的记录结果集,并返回给用户。由于查询操作是数据库系统发生最频繁的动作之一,因此如何提高查询性能就显得很重要。
为了提高查询性能,数据库系统中引入一个索引的概念,所谓索引就是根据表记录中的一个或多个列,通过一定的运算规则,将这些列的特征表示为一个数值或字符串。数据库系统将这些数值或字符串加上与之相关的记录rowid用一定的数据结构保存起来。这样当数据库接收到一个查询请求时,根据查询的条件,选择一个在此表上的索引(具体的选择过程是数据库的sql优化器来做的),根据这个索引的运算规则,计算出对应的索引值,从而可以快速地找到对应的记录rowid。
2. 在oracle系统索引是如何存储的?
对于oracle系统,基本的存储单位是数据块,索引也是存储在数据块中的,用来存储索引的数据块,我们称之为索引块。对于索引段的空间管理和一般的数据段时一样的。所不同的是,在索引块中用于存储索引的空间是:数据块的空间 - 数据块的管理开销 - 索引条目管理开销 - 索引长度开销(1字节).
在一种提到了数据库会将索引以一定的数据结构存储起来,这样做的目的是为了更快地查询到索引。在oracle系统索引是以平衡树的结构进行存储的,这样可以大大减少查询索引的时间,大概是log(n),而不用这个结构时,则是n/2。
对于使用平衡树存储的索引,有两个术语:叶块和分支块。其中叶块包含了键值-rowid数据对。
3. 如何对索引进行压缩?
在oracle系统中索引是按平衡树的结构进行存储的,观察这个结构当中的叶块就会发现,键值部分的前缀有可能是相同的,这样我们把不同叶块的相同的键值前缀存储一份让这些叶块进行共享,这样就可以减少存储空间了,这就是对索引的压缩。这种压缩过程是对键值的压缩,所以又称为键压缩。更具体一点,一个键包含两个部分:分组片断和唯一片断,这样压缩的过程就是只保留一份分组片断。
4. Oracle系统中索引的分类?
在Oracle系统中,索引被分为两大类:唯一索引和非唯一索引,他们在平衡树结构中的叶块存储的信息是不一样的。对于唯一索引,一个键值对应一个rowid;对于非唯一索引,一个键值可能对应多个rowid。