一、索引的作用




update hint 指定索引 update对索引的影响_update hint 指定索引

在数据访问的过程中,通过索引,可更为高效的访问特定数据信息,索引实际上是对数据库表中一列或多列的值进行排序的一种结构。根据以往的优化经验,相同逻辑的查询,在有无索引的情况下,性能差距在十几倍、几十倍甚至上百倍,在已有索引的情况下,也会由于索引创建的合理性而出现不同的性能效果,本文将针对索引的使用方面展开进一步讨论。

二、索引创建规范


update hint 指定索引 update对索引的影响_update hint 指定索引

1.  索引数量控制。

索引数量太多会严重影响DML操作。而且,在实际的应用中发现,当一个表中的索引太多时,对查询语句的效率也有负面的影响,因为索引太多,导致数据库产生的执行计划有可能不是最优的,同时过多的索引对于存储空间也会产生较大的负担。因此在建立索引时,一定要结合应用的需要,尽可能复用已有索引,避免出现冗余索引,冗余索引的定义如下。

update hint 指定索引 update对索引的影响_字段_03

2.  复合索引列的选择。

    建立复合索引时,索引列的顺序非常重要。确保索引的第一列出现在Where语句中,如多个列都会在Where语句中出现,将选择性较好的列(即唯一值较多的)列放在前面。

3.  除主键索引外索引表空间需与数据表空间分离。

4.  对于小表(数据量小于5000条记录为标准),如果需要频繁访问选择性高的字段时也应当创建相应的索引,避免由于小表数据异常情况下的膨胀导致性能问题放大。

5.  为了利于维护以及减少索引失效的风险隐患,分区表必须使用分区索引。

  • 分区索引的类型

分共索引支持如下几种类型:

update hint 指定索引 update对索引的影响_字段_04

  • 选择分区索引的原则

分区表必须使用本地(Local)索引,不可使用全局(Global)索引。

  • 建立分区索引必须指定表空间,并且指定的表空间要与数据表空间分开。

6.  创建或重建大表的索引时,为提高执行效率,可指定使用NOLOGGING子句,指定并行度,同时还应保证临时表空间足够大。语句执行完成后,需将索引属性改回LOGGING和相应的并行度。

7.  重建索引的时间最好选择在维护时间窗口,如果一定要在业务处理期间重建索引则使用online选项。如:ALTER INDEX IN_T_1 REBUILD ONLINE;(注:当一个表的记录数超过1千万时,或者存在频繁的DML语句操作的表,不要在线重建索引.)

三、索引设计指引


update hint 指定索引 update对索引的影响_update hint 指定索引

1.  索引类型选择

a.B-TREE索引:一般情况下均首选默认的b-tree索引

b.位图索引:对于列的不同值很少,且数据量较大,且DML操作很少,这种情况可以选择使用位图索引。比如性别,distinct value只有男和女,且DML操作也会很少,此时选择位图索引,效率可能会更高。注意:位图索引不适合频繁修改的字段,因为修改位图索引的字段时,锁定的记录数远大于修改普通索引的字段。

c.复合索引:当需要创建复合索引时,需要慎重考虑列在索引中的顺序,应将经常作为查询条件的列,和可选择性比较大的列放在索引列的最前面,以提高查询效率。如果一个索引的所有列刚好是另外一个索引的前导列,则建议将该索引删除。

2.  复合索引列的选择

    不管是单列索引还是复合索引,当列允许为空,且实际有空值时,在查询中可能会不走索引扫描,因为null值不在索引条目中。因此尽可能选择not null的列做为索引列,如果不能避免时,可以在建表时将列设置为非空,然后给一个缺省值的方法解决。

CREATE TABLE T (ID  INTEGER NOT NULL  DEFAULT 0 , NAME CHAR (2) , UPDATE_DT  DATE NOT NULL DEFAULT  TO_DATE(‘99991231’,’yyyymmdd’) ) ;

此列表T中字段UPDATE_DT 会被创建索引,但UPDATE_DT列可能会空,为了使索引在使用中不会因为null而失效,则对UPDATE_DT列做默认值处理

3.  函数索引的注意事项

尽量不采用函数索引,函数索引会在insert以及select时多一次函数计算的消耗。使用函数索引时,建索引的函数写法必须与SQL语句的where条件写法严格一致,包括大小写和空格。

4.  递减索引的考量

进行order by column desc排序时,综合考虑,创建column desc索引,不再额外进行排序操作。

如果应用经常需要对ID列排倒序(DESC),那么可以在ID列上创建DESC索引。

SELECT ID FROM T ORDER BY ID DESC;

CREATE INDEX IN_T_1 ON T(ID DESC);

四、小结




update hint 指定索引 update对索引的影响_update hint 指定索引

在各类应用程序中,最终返回的数据可以看作是特定应用功能最终的目的地,而索引则是其过程中所搭载的交通工具,交通工具的优化与否将直接影响到客户的体验以及应用系统的性能负载。因此,在实现功能的同时,我们也应关注过程及性能,避开索引使用时可能存在的隐患与陷阱,达到运维管理与应用效率的双赢。