oracle索引(Oracle数据库的全局索引的实现)
一、oracle 全局索引和局部索引的区别和作用
简单的说吧,分区索引需要对每个分区建立相同的索引,也就是开始的工作量会稍微大点,不分区索引,也就是说一个索引对全表建立就行;这样问题就出来了,当你对某个分区进行drop或者新建分区的话,同时你得对不分区索引进行重建,这样工作量也会变大;而分区索引当你对表进行drop分区或create分区的时候只需要在新分区建立新的索引即可。而且索引会随着表的增大而增大,所以不分区索引维护起来有点费劲,所以这个就看你自己建立的分区表是怎么样的了,是否比较容易维护索引
二、oracle的索引有几种
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 分区索引和全局索引有什么区别
这个怎么说呢?说点个人的理解吧。
分区索引在跨分区时,特别是跨N个分区时,就没用了,或者说,即使有用也是用处基本可以忽略不计的,因为在跨分区查询时分区索引效率确实不高。
全局索引则是一直有效的。
那么分区索引好在什么地方,我们举个例子,假设一张表有1000万条记录,分100个区,每取10万条,在同一个字段上有分区索引,和全局索引。而且基本上能保证每次查询都在同一个区。
那么如果调用全局索引,那么你要从1000万条素银信息中找你需要的内容;但是如果你调用分区索引,那么你只要从10万条索引信息中找就可以了。所以查询速度就会加快,这就是分区索引的好处。
举个例子就是,一个人当了某地的导游(假设有100个景点),那么他要掌握的东西一定非常多,我们假设他都记住了,那么他所耗费的精力(内存)一定非常大。假设这个地区有100个导游(每个景区一个,去其他景区基本抓瞎,可是每个景区的导游都是一个名字,假设就叫就叫“a”),每人一个景点,那么对于每一个导游来说,就是闭着眼睛也能记住。那么对于只是逛一个景点,或者时间充裕的逛两三个景点的人来说,找景区导游就够了。
但是如果一个人就要短时间内逛10个景点,每到一个景点还要换导游,那是不是很麻烦,而且因为时间短,为了省事,可能就找地区导游。