在Oracle数据库中,建立索引虽然比较简单。可是要合理的建立索引则比较困难了。笔者认为,在建立索引时要作到三个适当,即在适当的表上、适当的列上建立适当数量的索引。虽然这能够经过一句话来归纳优化的索引的基本准则,可是要作到这一点的话,须要数据库管理员作出很大的努力。具体的来讲,要作到这个三个适当有以下几个要求。
1、 根据表的大小来建立索引。
虽然给表建立索引,能够提升查询的效率。可是数据库管理员须要注意的是,索引也须要必定的开销的。为此并非说给全部的表都建立索引,那么就能够提升数据库的性能。这个认识是错误的。偏偏相反,若是无论三七二十一,给全部的表都建立了索引,那么其反而会给数据库的性能形成负面的影响。由于此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。因此笔者认为,数据库管理员首先须要作到,为合适的表来创建索引,而不是为全部的表创建索引。
通常来讲,不须要为比较小的表建立索引。如在一个ERP系统的数据库中,department表用来存储企业部门的信息。通常企业的部分也就十几个,最多不会超过一百个。这100条记录对于人来讲,可能算是比较多了。可是对于计算机来讲,这给他塞塞牙缝都还不够。因此,对相似的小表没有必要创建索引。由于即便创建了索引,其性能也不会获得很大的改善。相反索引创建的开销,如维护成本等等,要比这个要大。也就是说,付出的要比获得的多,显然违反常理。
另外,就是对于超大的表,也不必定要创建索引。有些表虽然比较大,记录数量很是的多。可是此时为这个表创建索引并必定的合适。如系统中有一张表,其主要用来保存数据库中的一些变动信息。每每这些信息只给数据库管理员使用。此时为这张表创建索引的话,反而不合适。由于这张表不多用到,只有在出问题的时候才须要查看。其次其即便查看,须要查询的纪录也不会不少,可能就是最近一周的更新记录等等。对于对于一些超大的表,创建索引有时候每每不可以达到预计的效果。并且在打表上创建索引,其索引的开销要比普通的表大的多。那么究竟是否给大表创建索引呢?笔者认为,主要是看两个方面的内容。首先是须要关注一下,在这张大表中常常须要查询的记录数量。通常来讲,若是常常须要查询的数据不超过10%到15%的话,那就没有必要为其创建索引的必要。由于此时创建索引的开销可能要比性能的改善大的多。这个比例只是一个经验的数据。若是数据库管理员须要得出一个比较精确的结论,那么就须要进行测试分析。即数据库管理员须要测试一下全表扫描的时间,看看其是否比创建索引后的查询时间要长或者短。若是是长的话,则说明有创建索引的必要。可是若是没有的话,则说明仍是全表扫描速度来的快。此时也就没有必要创建索引了。
总之,在考虑是否该为表创建索引时,通常来讲小表没有创建索引的必要。而对于打表的话,则须要进行实际状况实际分析。简单一点的,能够根据大体的比率来肯定。若是要精确一点的,则能够进行全表扫描性能分析,以判断创建索引后是否真的如预期那样改善了数据库性能。
2、 根据列的特征来建立索引。
列的特色不一样,索引建立的效果也不一样。数据库管理员须要了解为哪些列建立索引能够起到事倍功半的效果。同时也须要了解为哪些列建立索引反而起到的是事倍功半的效果。这有利于他们了解到底给为怎么样的字段创建索引。
根据笔者的经验,每每为以下特征的列建立索引可以起到比较明显的效果。如对于一些重复内容比较少的列,特别是对于那些定义了惟一约束的列。在这些列上创建索引,每每能够起到很是不错的效果。如对于一些null值的列与非Null值的列混合状况下,若是用户须要常常查询全部的非Null值记录的列,则最好为其设置索引。若是常常须要多表链接查询,在用与链接的列上设置索引能够达到事半功倍的效果。
可见,索引设置的是否恰当,不只跟数据库设计架构有关,并且还跟企业的经济业务相关。为此,对于一些套装软件,虽然一开始数据库管理员已经作了索引的优化工做。可是随着后来经济数据的增长,这个索引的效果会愈来愈打折扣。这主要是由于记录的表化影响到了索引优化的效果。因此笔者建议各位数据库管理员,即便采用的是大牌软件公司的套装软件,也须要隔一段时间,如一年,对数据库的索引进行优化。该去掉的去掉,该调整的调整,以提升数据库的性能。
如在数据库中有一张表是用来保存用户信息的。其中有个字段身份证号码,这是一个惟一的字段。在数据库设计时,给这个字段建立了索引。可是当这个数据库投入使用以后, 用户不怎么输入用户的身份证号码。并且平时也基本不按这个号码来进行查询。当记录月来月多时,这个身份证号码上的索引字段不但不可以改善数据库的查询性能,反而成了鸡肋。对于这些有不少NULL值的列,并且不会常常查询全部的非NULL值记录的列,数据库管理员要下决心,即便清除这些列上的索引。
因此说索引的优化与调整是一个动态的过程,并非说数据库设计好以后就不须要通过调整。数据库管理员每每须要根据记录的变化状况,来进行适当的变动。以提升索引的效果。
3、 在一个表上建立多少索引合适?
虽说,在表上建立索引的数量没有限制,可是决不是越多越好。也就是说,在建立索引这项事情上,1+1〉2每每不成立。有时候,建立索引越多,其可能会获得拔苗助长的效果。那么在一个表上,到底给建立多少索引合适呢?这个没有一个明确的标准。而是须要数据库管理员根据实际的用途以及数据库中记录的状况,来进行判断。
一般来讲,表的索引越多,其查询的速度也就越快。可是,表的更新速度则会下降。这主要是由于表的更新(如往表中插入一条记录)速度,反而随着索引的增长而增长。这主要是由于,在更新记录的同时须要更新相关的索引信息。为此,到底在表中建立多少索引合适,就须要在这个更新速度与查询速度之间取得一个均衡点。如对于一些数据仓库或者决策型数据库系统,其主要用来进行查询。相关的记录每每是在数据库初始化的时候倒入。此时,设置的索引多一点,能够提升数据库的查询性能。同时由于记录不怎么更新,因此索引比较多的状况下,也不会影响到更新的速度。即便在起初的时候须要导入大量的数据,此时也能够先将索引禁用掉。等到数据导入完毕后,再启用索引。能够经过这种方式来减小索引对数据更新的影响。相反,若是那些表中常常须要更新记录,如一些事务型的应用系统,数据更新操做是屡见不鲜的事情。此时若是在一张表中创建过多的索引,则会影响到更新的速度。因为更新操做比较频繁,因此对其的负面影响,要比查询效率提高要大的多。此时就须要限制索引的数量,只在一些必要的字段上创建索引。
笔者在平时数据库优化时,每每会根据这些表的用途来为列设置索引。能够查询相关的动态视图,看看对于这张表的操做,是更新操做(包括更新、删除、插入等等)占的比例大,仍是查询操做占的比例大。当过多的索引已经影响到更新操做的速度时,则数据库管理员就须要先禁用某些索引,以提升数据库的性能。
总之,在适当的表、适当的列上创建适当的索引。这一句话包含的意思有不少,以上内容只是一部份内容。俗话说,师傅领进门,修行靠自身。笔者在这里指可以点到为止。一些具体的索引优化内容仍是须要各位读者在平常工做中去体会与总结。 数据库
在Oracle建立索引的实际操做中有一些限制条件。就是说表或是列创建的相关索引并非越多越好,而是相关索引建的越多,反而会影响到Oracle数据库在运行中的总体性能,因此,在创建索引的时候,仍然会有一些限制条件。架构
一是不要对一些记录内容比较少的表创建索引数据库设计
在一个应用系统设计的时候,如设计一个ERP系统的数据库,其虽然有几千张表。可是,并非每张表都有大量记录的。相反,其中有近一半左右的数据表,可能其存储的数据不会超过百条。如员工登录账户密码表、企业部门信息表等等。对于这些记录内容比较少的表,咱们创建最好不要为其创建索引。不管是表上的,仍是字段上,都不要Oracle创建索引。性能
二是若表中的内容比较大测试
可是,这个表基本上不怎么查询的时候,则只须要在表上创建索引便可;而不须要在字段上创建索引。如如今在ERP系统中,有一张表是“AD_Table”。其存储的是这个数据库中相关表的信息。这张表只有在数据库设计的时候才会用到。故这张表中的记录虽然比较多,可是因为用户用的比较少,因此,通常没有必要为这张表创建列级别上的索引。而直接用表索引来代替。优化
三是在一些NULL字段上spa
要根据实际状况来判断是否要创建索引。如如今有一张人事档案的表格,其上面有两个字段,分别为“身份证号码”与“地区”。有时会为了某个缘由,企业须要全部员工都在系统中登记他们的身份证号码,以方便他们办工资卡、社会保险等等。因此人事管理可能须要常常的查询系统,看看有没有没有身份证号码的员工信息。设计
此时,就须要利用条件“IS NULL”来查询咱们所须要的记录。故为了提升查询效率,若某个记录可能为空,而且常常须要以NULL为条件进行查询的时候,则最好给这个字段添加一个索引,而且最好创建位图索引。相反,若虽然可能会以NULL这个条件做为查询的限制语句,可是,用的不是不少的时候,则就没有必要为其创建索引。htm
建议三:多表链接查询的索引设计索引
如如今有一我的事管理系统。人事经理想知道员工的社保缴纳状况。他须要知道员工的姓名、职务、户籍性质(农民户口跟居民户口费用不同)、缴纳的状况等等。可是,这些信息包含在不一样的表中。由于为了提升Oracle数据库的性能,在表中存储的可能只是某些序号,而不是具体的内容。
如在社保表中,存储的是员工对应的编号,而不是员工的名字。因此,要获得这份报表的话,就可能须要关联员工基本信息表、公司组织结构表等表格,才可以查询到用户所须要的内容。为此,就须要利用Join语句,把这些表格关联起来。为了提升数据库的查询效率,这些用来关联的字段,最好可以创建索引。这能够显著的提升查询的速度。
建议四:在表的更新速度与查询速度之间寻求一个平衡点
众所周知,索引自己并不影响数据库的使用,其主要是为了提升Oracle数据库的查询效率。可是,因为当数据库的表中的数据更新的时候,包括记录的增长、删除、更改等等,都会对虽有的索引进行更新。
很明显,索引虽然能够提升查询速度。可是,也会对一些表的更新操做产生不良的影响。当在表中创建的索引越多,这个不利影响也会越大。故Oracle数据库管理员在设置索引的时候,还须要注意,在这两个之间须要一个均衡点。
按照通常的理论来讲,当某个表多数用来查询、更新相对来讲比较上的话,则要多多采用索引。相反,当某个表记录更新居主导,查询相对来讲比较少的话,则不要创建太多的索引,避免对更新的速度差生不利影响。在实际工做中,若某个表频繁的被视图所调用的话,则最好就好设置比较多的索引了。