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

1、 B* 树索引

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

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

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

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

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

2、 位图索引( bitmap index )

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

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

3、 基于函数的索引( function-based index )

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

4、 应用域索引( application domain index )

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

5、HASH索引
使用HASH索引必须要使用HASH群集。建立一个群集或HASH群集的同时,也就定义了一个群集键。这个键告诉Oracle如何在群集上存储表。在存储数据时,所有与这个群集键相关的行都被存储在一个数据库块上。若数据都存储在同一个数据库块上,并且使用了HASH索引,Oracle就可以通过执行一个HASH函数和I/O来访问数据——而通过适用一个二元高度为4的B-树索引来访问数据,则需要在检索数据时使用4个I/O。
技巧:HASH索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。

6、分区索引
分区索引就是简单地把一个索引分成多个片断,这样可以访问更小的片断,并且可以把这些片断分别存放在不同的硬盘上(避免I/O问题)。B-数索引和位图索引都可以被分区,HASH索引不可以被分区。
有两种类型的分区索引:本地分区索引和全局分区索引。每个类型都有两个子类型,有前缀索引和无前缀索引。如果使用了位图索引就必须是本地索引。
把索引分区最主要的原因是可以减少所需读取的索引的大小,另外把分区放在不同的表空间中可以提高分区的可用性和可靠性。

Oracle的几种索引的更多相关文章

  1. 深入学习Oracle分区表及分区索引

    关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Has ...

  2. oracle 分区表和分区索引

    很复杂的样子,自己都没有看完,以备后用 http://hi.baidu.com/jsshm/item/cbfed8491d3863ee1e19bc3e ORACLE分区表.分区索引ORACLE对于分区 ...

  3. ORACLE分区表、分区索引详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt160 ORACLE分区表.分区索引ORACLE对于分区表方式其实就是将表分段 ...

  4. 【三思笔记】 全面学习Oracle分区表及分区索引

    [三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可 ...

  5. oracle分区表和分区索引概述

    ㈠ 分区表技术概述            ⑴ Range 分区            ① 例子                  create table t         (...列定义...)  ...

  6. java:Oracle(视图,索引,序列)

    1.索引:索引一共分为4种 -- 在oracle中, -- normal:普通索引 -- unique:唯一索引 -- bitmap:位图索引 -- B 树索引:默认:如果不建立索引的情况下,orac ...

  7. Oracle执行计划不走索引的原因总结

    在Oracle数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一下. 不走索引大体有以下几个原 ...

  8. Mysql常见四种索引的使用

    提到MySQL优化,索引优化是必不可少的.其中一种优化方式 --索引优化,添加合适的索引能够让项目的并发能力和抗压能力得到明显的提升. 我们知道项目性能的瓶颈主要是在"查(select)&q ...

  9. jdbc/ojdbc连oracle的三种方式(转)

    文章转自:http://blog.itpub.net/22664653/viewspace-1383092/ 前言  本文是一篇学习笔记,学习如何通过java jdbc /ojdbc 连接oracle ...

随机推荐

  1. [Android]通过setImageURI设置网络上面的图片

    设置imageView显示网络上的图片 picUrl = new URL(getIntent().getExtras().getString("map_url")); Bitmap ...

  2. android:duplicateParentState属性解释

    android:duplicateParentState指的是当前控件是否跟随父控件的(点击.焦点等)状态 例:假设一Layout有两子View,对Layout进行监听点击事件:子ViewA一个设置d ...

  3. Navicat_Preminum

    一. 安装 参考http://blog.csdn.net/longyuhome/article/details/79206041. 软件准备• [OYKSOFT.COM]navicat11.0.8_p ...

  4. 方案:手动升级WordPress系统

    对于WordPress系统及时进行更新维护是十分必须的操作,更新维护不仅可以更新系统服务功能,还能够完善安全系统.      如果你是虚拟主机的用户,可以使用FTP账户进行自动更新服务,但是如果你是V ...

  5. poj3349(哈希+链地址法)

    给出N个六边形的6个边长,问其中是否有完全相同的两个六边形,完全相同包括边的长度和位置都要相同.边给出的顺序是逆时针或者顺时针的. 给每个6边形一个哈希值,方法是对6条边长度的平方和取模 #inclu ...

  6. SOCKET 实现NAT 穿越

    在当前IPv4NAT盛行的网络环境下,两个用户要直接进行P2P连接是非常困难的.较好的解决办法是借助含公网的用户或是服务器中介实现P2P连接. NAT:Network Address Translat ...

  7. SharePoint excel service web part 连接到 filter web part

    本文讲述SharePoint excel service web part 连接到 filter web part的一个简单应用场景. SharePoint excel service web par ...

  8. linux指定动态运行库的位置

    动态运行库在windows.linux下均广泛使用.windows下通常为dll文件,linux下为so文件.不过,对于部署程序,这两个系统查找依赖的运行库文件时却不一样.对于windows而言,优先 ...

  9. python高级编程之超类02:super的缺陷

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #当使用多重继承层次结构时,再使用super的时候是非常危险的,主要 ...

  10. ping不通的几种可能原因

    平时使用中常常会碰到ping不通的情况,ping不通的原因有非常多,比方路由设置问题,比方网络问题,下面列出几点原因:      1.太心急.即网线刚插到交换机上就想Ping通网关,忽略了生成树的收敛 ...