Oracle 创建索引的基本规则总结

原创 2013年12月04日 23:11:53

1.  选择索引字段的原则:

  • 在WHERE子句中最频繁使用的字段 
  •  联接语句中的联接字段
  • 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好)
  • Oracle在UNIQUE和主键字段上自动建立索引
  • 在选择性很差的字段上建索引只有在这个字段的值分布非常倾斜的情况下才有益(在这种情况下,某一,两个字段值比其它字段值少出现很多)
  • 不要在很少独特值的字段上建B-TREE索引,在这种情况下,你可以考虑在这些字段上建位图索引.在联机事务处理环境下,并发性非常高,索引经常被修改,所以不应该建位图索引
  • 不要在经常被修改的字段上建索引.当有UPDATE,DELETE,INSETT操作时,ORACLE除了要更新表的数据外,同时也要更新索引,而且就象更新数据一样,或产生还原和重做条目
  • 不要在有用到函数的字段上建索引,ORACLE在这种情况,优化器不会用到索引,除非你建立函数索引
  • 可以考虑在外键字段上建索引,这些索引允许当在主表上UPDATE,DELETE操作时,不需要共享子表的锁,这非常适用于在父表和子表上有很多并发的INSERT,UPDATE和DELETE操作的情况
  • 当建立索引后,请比较一下索引后所获得的查询性能的提高和UPDATE,DELETE,INSERT操作性能上的损失,比较得失后,再最后决定是否需建立这个索引 

    2.  选择建立复合索引

     复合索引的优点:

    • 改善选择性:复合索引比单个字段的索引更具选择性 
    •  减少I/O:如果要查询的字段刚好全部包含在复合索引的字段里,则ORACLE只须访问索引,无须访问表

    什么情况下优化器会用到复合索引呢?

           (a) 当SQL语句的WHERE子句中有用到复合索引的领导字段时,ORACLE优化器会考虑用到复合索引来访问.

           (b) 当某几个字段在SQL语句的WHERE子句中经常通过AND操作符联合在一起使用作为过滤谓词,并且这几个字段合在一起时选择性比各自单个字段的选择性要更好时,可

           能考虑用这几个字段来建立复合索引.

           (c) 当有几个查询语句都是查询同样的几个字段值时,则可以考虑在这几个字段上建立复合索引.

    复合索引字段排序的原则:

    • 确保在WHERE子句中使用到的字段是复合索引的领导字段 
    •  如果某个字段在WHERE子句中最频繁使用,则在建立复合索引时,考虑把这个字段排在第一位(在CREATE INDEX语句中) 
    •  如果所有的字段在WHERE子句中使用频率相同,则将最具选择性的字段排在最前面,将最不具选择性的字段排在最后面 
    •  如果所有的字段在WHERE子句中使用频率相同,如果数据在物理上是按某一个字段排序的,则考虑将这个字段放在复合索引的第一位

    二、位图索引

    什么情况下位图索引能够改善查询的性能呢?

    • WHERE子句包含多个谓词于中低基数的字段 
    •  单个的谓词在这些中低基数的字段上选取大量的行 
    •  已经有位图索引创建于某些或全部的这些中低基数的字段上
    • 被查询的表包含很多行
    • 可以在单一个表上建立多个位图索引,因此,位图索引能够改善包含冗长WHERE子句的复杂查询的性能,在合计查询和星形模型的联接查询语句中,位图索引也可以提供比较优良的性能

    位图索引与B-TREE索引的比较

    • 位图索引更节省存储空间
    • 位图索引比较适用于数据仓库环境,但不适于联机事务处理环境.在数据仓库环境,数据维护通常上通过批量INSERT和批量UPDATE来完成的,所以索引的维护被延迟直到DML操作结束.举例:当你批量插入1000行数据时,这些插入的行被放置到排序缓存中(SORT BUFFER),然后批处理更新这1000个索引条目,所以,每一个位图段在每一个DML操作中只需更新一次,即使在那个位图段里有多行被更新
    • 一个键值的压缩位图是由一个或多个位图段所组成,每一个位图段大约相当于半个BLOCK SIZE那么大,锁的最小粒度是一个位图段,在联机事务处理环境,如果多个事务执行同时的更新(即并发的更新),使用位图索引就会影响UPDATE,INSERT,DELETE性能了
    • 一个B-TREE索引的条目只包含一个ROWID,因此,当一个索引条目被锁定,即一行被锁定.但是对于位图索引, 一个索引条目潜在地有可能包含一段ROWID(即某一个范围内的ROWID,有多个ROWID),当一个位图索引条目被锁定时,则这个条目包含的那一段ROWID都被锁定,从而影响并发性.当一个位图段内的ROWID的数量越多时,并发性就越差.虽然如此,对于BULK INSERT,UPDATE和DELETE,位图索引的性能还是比B-TREE索引要好

建立索引常用的规则

1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段...
  • zhongguoren666
  • zhongguoren666
  • 2011年09月06日 09:13
  • 7832

Oracle创建索引的基本规则

Oracle创建索引的基本规则   一、B-Tree索引   1. 选择索引字段的原则:   在WHERE子句中最频繁使用的字段   联接语句中的联接字段   选择高选择...
  • yunxizixuan
  • yunxizixuan
  • 2014年07月10日 17:20
  • 264

oracle 索引,基本规则

建立索引常用的规则如下: 1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句...
  • quechao123
  • quechao123
  • 2011年05月25日 10:37
  • 465

数据库创建索引的一些原则

一,经常被用来过滤记录的字段。1. primary key 字段, 系统自动创建主键的索引;2. unique kye 字段,系统自动创建对应的索引;3. foreign key 约束所定义的作为外键...
  • tenfyguo
  • tenfyguo
  • 2009年03月09日 21:18
  • 10315

oracle数据库建立索引的原则

数据库建立索引的原则 1,确定针对该表的操作是大量的查询操作还是大量的增删改操作。 2,尝试建立索引来帮助特定的查询。检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引。 3,尝...
  • zbyluxzing
  • zbyluxzing
  • 2016年08月08日 23:16
  • 2870

oracle 创建索引 规则

一.B-Tree索引: 1.       选项择索引字段的原则: l           在WHERE子句中最频繁使用的字段 l           联接语句中的联接字段 l           选择...
  • managergh
  • managergh
  • 2011年06月05日 00:17
  • 5276

oracle创建索引---如何创建所以

今天在update一个字段时候,因为数据量比较大,所以慢的像蜗牛一样 然后就在相应的字段上面加了一个索引:  create index indexName on tableName(conlu...
  • datouniao1
  • datouniao1
  • 2017年08月11日 17:43
  • 412

oracle 创建索引 规则 .

一.B-Tree索引: 1.       选项择索引字段的原则: l           在WHERE子句中最频繁使用的字段 l           联接语句中的联接字段 l     ...
  • CsethCRM
  • CsethCRM
  • 2014年03月26日 10:50
  • 411

物化视图,索引视图,函数索引;创建索引时使用DESC

一、物化视图 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。 ...
  • buxizhizhou530
  • buxizhizhou530
  • 2015年05月06日 16:32
  • 2237

oracle 进阶三(索引、权限,角色)

索引 加速数据的存取,合理的使用索引可以大大降低i/o 的次数,提高访问的性能 单列索引:基于单个列所建立的索引 create index 索引名 on 表名(列名); 复合索引:基于多个列的...
  • Thinker_lk
  • Thinker_lk
  • 2016年12月11日 21:43
  • 572
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle 创建索引的基本规则总结
举报原因:
原因补充:

(最多只允许输入30个字)