索引对数据库访问的性能的作用十分巨大,设计合理的索引对于系统性能调整至关重要。而使用索引又是数据库开发过程中最困难的一点。在设计和使用索引的时候要注意以下几个方面:
l 在OLTP系统中,尽量避免全表扫描,尽量使绝大多数操作都通过索引访问
l 当查询返回少量数据的时候,索引能极大的优化你的查询,根据经验,返回数据的数量最好少于总数量的25%
l 索引能改进数据检索的速度,但是它能使数据更新的速度减慢 。 大量插入,删除,更新数据可以先删除索引,然后等操作完成后,再建立索引,可以节省很多时间。
l 索引字段不应该有大量的空值 NULL .
l 数据量很大并且经常变动的表上的索引不易过多,过量的索引会导致插入、更新和删除操作变慢,产生大量的IO,如果一张表上的索引超过8个,就需要检查是否这些索引都是必要的。(但是要值得注意的是这条原则很可能被过度的夸大。因为绝大多数OLTP系统,写操作不足10%,绝大多数的操作是读。因此如果是设计的合理,并不能说一张表上的索引超过多少就是不合理的)
l 如果索引数量过多,建议删除部分所有的列都建有独立索引的复合索引,复合查询操作可以通过使用两个独立列的索引结果集合并来获取,也可以保障查询效率
l 小表不要建立索引,可能通过索引访问速度更慢,把小表放入KEEP 池效率更高
l 索引的PCTFREE、INITTRANS、MAXTRANS参数设置十分重要,特别是对于变化十分大的索引
l 对于比较大的索引,使用索引分区会改善效率
l 位图索引对于列表类值的效果较好(索引大小也比较小),但是位图索引不适合变化十分频繁的表
l 使用函数索引可以避免大量不必要的全表扫描
l 如果索引包含了查询需要的所有信息,查询就不需要访问表的数据,可以大大提高访问效率,因此要注意建立合理的复合索引,并注意SQL语句的合理性
l 用好索引组织表(IOT)
l 可以使用反转索键值索引来消除索引相关的热块
l 随着数据的变化,索引的效率会下降,因此定期重建索引对于性能提升有很大帮助
l 使用CBO优化器的情况下,保证表和索引的数据得到了良好的分析是保证优化器选择最佳执行计划的关键
l 删除所有不必要的索引。ORACLE 9i提供的新特性可以使DBA能够跟踪索引的使用情况,用这个功能找到不使用的索引,并把这些索引删除
l 9i的一个新特性跳跃式索引扫描(Index Skip Scan).
例如表有索引index(a,b,c),当查询条件为
where b=?的时候,可能会使用到索引index(a,b,c)
如,执行计划中出现如下计划:
INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)
Oracle的优化器(这里指的是CBO)能对查询应用Index Skip Scans至少要有几个条件:
1 优化器认为是合适的。
2 索引中的前导列的唯一值的数量能满足一定的条件(如重复值很多)。
3 优化器要知道前导列的值分布(通过分析/统计表得到)。
4 合适的SQL语句
l 如果表上有a,b两个列
如果每次单独对a或b进行查询的话,那分别建立两个索引比较好,
但是还得考虑select里面的查询的条件,如果能仅仅查询索引就得到数据那就最好了
如果经常进行a,b的联合查询建立一个复合索引效果就会比较好
跳跃索引扫描是在仅仅存在复合索引的情况下,单独对b进行查询时候出现
l 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-604910/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-604910/