您的位置:首页 > 数据库 > Oracle

乱谈2--索引

2014-01-26 09:48 274 查看
索引是数据库中最基本的对象之一,我相信没有哪个生产数据库是完全没有索引的。索引存在的目的就是加速数据的访问速度。如果索引没有起到提升数据访问速度的作用,那么这个索引就是没有用的,甚至是有害的。我见过许多的系统中,因为低效的索引的存在,导致SQL的执行缓慢,应用程序运行的缓慢。由此可见,索引对于数据库来说是极其重要的。

绝大部分的索引都是基于表的,但是也有特殊的情况存在,那就是索引组织的表IOT。索引组织的表是表的一种,但我更愿意把他当成是一种特殊的索引,因为IOT的结构和索引的结构是一样的。就好比说是熊猫,它虽然叫猫,但实际上是熊一样的道理。

下面我们建立一个普通的索引。

CREATE TABLE TEST (ID VARCHAR2(10),NAME VARCHAR2(20));

CREATE INDEX IND_TEST ON TEST (ID);

这样我们就在表TEST上创建了一个最简单的索引IND_TEST。创建索引是如此的简单,每个人都可以在自己的系统上随心所欲的创建索引。可是我们应该知道,只有合理的高效的索引才会提高系统性能,加快数据访问的速度。相信没有人希望自己的系统是一个病态的缓慢的系统,那么就需要我们在创建索引的时候多想想,多测测。一个糟糕的索引对系统的影响远比你想象的要大。以前会经常帮助同事做一些SQL优化的事情,其中大概40%的问题都是来自于那些糟糕的索引。当我对他们提出删掉索引的建议的时候,他们往往感到很费解,总是问一大堆为什么。在我看来,删掉的原因很简单,因为这些索引是低效的,不合理的。

前面的问题是很普遍的。从我工作第一天起就听到周围的人讨论索引如何如何的好,建了索引SQL后如何如何的快之类的。那时索引对我来说就象是一个SQL执行加速的开关,按下开关,系统会飞一样的运行。这就和TOM说的那个神奇的参数FAST = TRUE是一个效果的,但实际上这是不可能的。如果真的那么神奇,为什么oracle不默认的为你创建大量的索引呢。

要想合理的使用索引首先得对索引有深刻的理解。我们常见的索引大概有下面几种,B+索引,位图索引,反转索引,函数索引。下面简单对这几种索引进行下介绍:

B+索引:最常见的索引,树型结构,在OLTP和OLAP系统中都很常见

位图索引:8i后提供的索引,位图结构,在OLAP系统中常见

反转索引:在建立索引时候加上reverse,B+索引的变形,可以减少索引叶上的争用

函数索引:8i后提供的索引,树型结构,需要在CBO下才可以工作

反转索引我在生产系统中没有用过,所以也不大清楚具体的效果怎么样。但是根据反转索引的原理确实很容易想到为什么它会减少争用,但是对于id like ‘abc%’的这种情况反转索引是无能为力的。而函数索引却是很常用的,可以使象substr(id,1,4) = ‘abcd’条件也使用上索引。位图索引由于位图的结构会相对于B+索引节约很多的空间,也是由于位图的结构他并不适合那些经常的操作。对位图索引中的一条记录更新的时候会锁住相邻的很多条记录,锁是OLTP中最大的敌人,所以位图索引并不适合那些频繁更新的OLTP系统。OLAP系统中更新并不常见,所以位图索引会工作的很好。B+索引就没什么说得了,这是大家最熟悉最常见的索引。

索引的最大列数和索引列的长度都是有限制的,这些限制使得索引不会太大,如果索引比表本身还要大的话,那么索引的使用范围就会小得多。刚才忘记说了,索引之所以能够加速查询,首先是因为索引的组织结构,其次因为索引的体积比表本身要小得多。

索引和表一样都是可以被压缩的。索引的压缩是8i提供的特性吧,而表的压缩是9i提供的特性。当时在测试索引压缩的时候,当索引的重复列比较多的时候,压缩的效果很不错,对查询性能的提升也是很显著的。但是8i的索引压缩是比较傻的,经常会出现压缩后的索引比压缩前还要大的情况。而这种情况在表压缩中却是见不到的。不知道现在10g中的索引压缩会不会聪明一些呢。

关于索引的扫描方式我在原来的一篇文章里面已经提到了。但是我还是要说一些索引快速全扫描和索引全扫描,这两种扫描方式实在是很容易混淆。这两个名字起得也不好,那么接近,很容易误导人。索引快速全扫描的方式是多块读的,他不会区分根结点,枝结点和叶结点,他的扫描方式很象全表扫描的方式;索引全扫描则是单块读取,利用叶结点之间的指针来实现的。希望大家以后不要在把两者混为一谈。

    先写到这吧,以后想起来什么在补充吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 索引 优化