乱谈2--索引

索引是数据库中最基本的对象之一,我相信没有哪个生产数据库是完全没有索引的。索引存在的目的就是加速数据的访问速度。如果索引没有起到提升数据访问速度的作用,那么这个索引就是没有用的,甚至是有害的。我见过许多的系统中,因为低效的索引的存在,导致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中的索引压缩会不会聪明一些呢。
关于索引的扫描方式我在原来的一篇文章里面已经提到了。但是我还是要说一些索引快速全扫描和索引全扫描,这两种扫描方式实在是很容易混淆。这两个名字起得也不好,那么接近,很容易误导人。索引快速全扫描的方式是多块读的,他不会区分根结点,枝结点和叶结点,他的扫描方式很象全表扫描的方式;索引全扫描则是单块读取,利用叶结点之间的指针来实现的。希望大家以后不要在把两者混为一谈。
    先写到这吧,以后想起来什么在补充吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值