Oracle 索引概述

Oracle提供了多种不同类型的索引以供使用。简单地说,Oracle中包括如下索引: 


B*树索引:这些是我所说的“传统“索引。到目前为止,这是Oracle 和大多数其他数据库中最常用的索引。B*树的构造类似于二叉树,能根据键提供一行或一个行集的快速访问,通常只需很少的读操作就能找到正确的行。不过,需要注意重要的一点, ”B*树“中的”B“不代表二叉(binary) ,而代表平衡(balanced) 。B*树索引并不是一颗二叉树,这一点在介绍如何在磁盘上物理地存储B*树时就会了解到。


B*树索引有以下子类型: 

索引组织表(index organized table) :索引组织表以B*树结构存储。堆表的数据行是以一种无组织的方式存储的(只要有可用的空间,就可以放数据) ,而IOT与之不同,IOT中的数据要按主键的顺序存储和排序。对应用来说,IOT 表现得与“常规“表并无二致;需要使用 SQL 来正确地访问 IOT。IOT 对信息获取、空间系统和OLAP应用最为有用。 


B*树聚簇索引(B*tree cluster index)这些是传统B*树索引的一个变体(只是稍有变化) 。B*树聚簇索引用于对聚簇键建立索引(见第11.章中“索引聚簇表“一节),所以这一章不再讨论。在传统B*树中,键都指向一行;而B*树聚簇不同,一个聚簇键会指向一个块,其中包含与这个聚簇键相关的多行。 B树索引介绍

降序索引(descending index) :降序索引允许数据在索引结构中按“从大到小“的顺序(降序)排序,而不是按”从小到大“的顺序(升序)排序。我们会解释为什么降序索引很重要,并说明降序索引如何工作。

 
反向键索引(reverse key index) :这也是 B*树索引,只不过键中的字节会“反转“。利用反向键索引,如果索引中填充的是递增的值,索引条目在索引中可以得到更均匀的分布。例如,如果使用一个序列来生成主键,这个序列将生成诸如 987500、987501、987502 等值。这些值是顺序的,所以倘若使用一个传统的 B*树索引,这些值就可能放在同一个右侧块上,这就加剧了对这一块的竞争。利用反向键,Oracle 则会逻辑地对 205789、105789、005789 等建立索引。Oracle 将数据放在索引中之前,将先把所存储数据的字节反转,这样原来可能在索引中相邻放置的值在字节反转之后就会相距很远。通过反转字节,对索引的插入就会分布到多个块上。 


位图索引(bitmap index) :在一颗 B*树中,通常索引条目和行之间存在一种一对一的关系:一个索引条目就指向一行。而对于位图索引,一个索引条目则使用一个位图同时指向多行。位图索引适用于高度重复而且通常只读的数据(高度重复是指相对于表中的总行数,数据只有很少的几个不同值)。考虑在一个有 100 万行的表中,每个列只有 3 个可取值:Y、N 和 NULL。举例来说,如果你需要频繁地统计多少行有值Y,这就很适合建立位图索引。不过并不是说如果这个表中某一列有11.000个不同的值就不能建立位图索引,这一列当然也可以建立位图索引。在一个 OLTP 数据库中,由于存在并发性相关的问题,所以不能考虑使用位图索引(后面我们就会讨论这一点) 。注意,位图索引要求使用Oracle企业版或个人版。bitmap介绍


位图联结索引(bitmap join index):这为索引结构(而不是表)中的数据提供了一种逆规范化的方法。例如,请考虑简单的 EMP 和 DEPT 表。有人可能会问这样一个问题: “多少人在位于波士顿的部门工作?“EMP 有一个指向 DEPT 的外键,要想统计 LOC 值为 Boston 的部门中的员工人数,通常必须完成表联结,将LOC列联结至 EMP记录来回答这个问题。通过使用位图联结索引,则可以在EMP表上对LOC列建立索引。 


基于函数的索引(function-based index) :这些就是B*树索引或位图索引,它将一个函数计算得到的结果存储在行的列中,而不是存储列数据本身。可以把基于函数的索引看作一个虚拟列(或派生列)上的索引,换句话说,这个列并不物理存储在表中。基于函数的索引可以用于加快形如SELECT * FROM T WHERE FUNCTION(DATABASE_COLUMN) = SAME_VALUE 这样的查询,因为值FUNCTION(DATABASE_COLUMN)已经提前计算并存储在索引中。 


应用域索引(application domain index):应用域索引是你自己构建和存储的索引,可能存储在Oracle 中,也可能在 Oracle 之外。你要告诉优化器索引的选择性如何,以及执行的开销有多大,优化器则会根据你提供的信息来决定是否使用你的索引。Oracle文本索引就是应用域索引的一个例子;你也可以使用构建Oracle文本索引所用的工具来建立自己的索引。需要指出,这里创建的“索引“不需要使用传统的索引结构。例如,Oracle 文本索引就使用了一组表来实现其索引概念。 


可以看到,可供选择的索引类型有很多。在下面几节中,我将提供有关的一些技术细节来说明某种索引如何工作,以及应该何时使用这些索引。需要重申一遍,在此不会涵盖某些与DBA 相关的主题。例如,我们不打算讨论在线重建索引的原理;而会把重点放在与应用相关的实用细节上。 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值