`
noblemoon
  • 浏览: 24846 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
一、B-Tree索引

1.  选择索引字段的原则:
(a).在WHERE子句中最频繁使用的字段
(b).联接语句中的联接字段
(c).选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好)
(d).ORACLE在UNIQUE和主键字段上自动建立索引
(e).在选择性很差的字段上建索引只有在这个字段的值分布非常倾斜的情况下才有益(在这种情况下,某一,两个字段值比其它字段值少出现很多)
(f).不要在很少独特值的字段上建B-TREE索引,在这种情况下,你可以考虑在这些字段上建位图索引.在联机事务处理环境下,并发性非常高,索引经常被修改,所以不应该建位图索引
(g).不要在经常被修改的字段上建索引.当有UPDATE,DELETE,INSETT操作时,ORACLE除了要更新表的数据外,同时也要更新索引,而且就象更新数据一样,或产生还原和重做条目
不要在有用到函数的字段上建索引,ORACLE在这种情况,优化器不会用到索引,除非你建立函数索引
(h).可以考虑在外键字段上建索引,这些索引允许当在主表上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索引要好
四、建立索引常用的规则如下

(a) 表的主键、外键必须有索引;
(b) 数据量超过300的表应该有索引;
(c) 经常与其他表进行连接的表,在连接字段上应该建立索引;
(d) 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
(e)索引应该建在选择性高的字段上;
(f) 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
(g)复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
        A、正确选择复合索引中的主列字段,一般是选择性较好的字段;

        B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

        C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

        D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

        E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

频繁进行数据操作的表,不要建立太多的索引;
删除无用的索引,避免对执行计划造成负面影响;
        以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
分享到:
评论

相关推荐

    Oracle11g从入门到精通2

    6.3.2 创建索引 6.3.3 删除索引 6.4 视图 6.4.1 视图的概念 6.4.2 创建视图 6.4.3 视图更改 6.4.4 删除视图 6.5 数据操纵与数据查询 6.5.1 复制原表插入记录 6.5.2 使用视图 6.5.3 使用PL/SQL...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    Oracle数据库性能优化的艺术 (文平) 高清PDF扫描版

    9.7 创建压缩的索引 / 305 9.8 索引的使用监测 / 305 9.9 对分区表建立索引/ 310 第10章 实例效率:识别数据库内部作为 / 312 10.1 研究数据库运行效率 / 313 10.2 操作系统的使用方法 / 338 10.3 调整...

    精通SQL 结构化查询语言详解

    4.2.5 使用UNIQUE关键字创建惟一索引  4.2.6 使用CLUSTERDE关键字创建簇索引 4.2.7 索引的销毁  4.2.8 使用索引的几点原则  4.3 视图的基础知识  4.3.1 视图简介  4.3.2 视图的优缺点  4.4 视图的创建...

    sql总结.doc

    2.可以加大数据的检索速度,这也是创建索引的主要原因。 3.可以加速表与表之间的连接效率。 4.在分组排序时使用索引,可以减少分组排序的时间。 (6)索引的优缺点 索引的优点既索引的作用。 索引的缺点:1.建立索引...

    精通SQL--结构化查询语言详解

    4.2.6 使用clusterde关键字创建簇索引 71 4.2.7 索引的销毁 73 4.2.8 使用索引的几点原则 73 4.3 视图的基础知识 74 4.3.1 视图简介 74 4.3.2 视图的优缺点 74 4.4 视图的创建与销毁 75 4.4.1 基本创建语法 ...

    SQL21日自学通

    在创建索引时使用UNIQUE 关键字214 索引与归并216 群集簇的使用217 总结218 问与答219 校练场219 练习220 第11 天事务处理控制221 目标221 事务控制221 银行应用程序222 开始事务处理223 结束事务处理225 取消...

    数据库课程设计题目汇总.doc

    创建规则,使得作者的E-Mail必须满足电子邮件的基本格式; 建立数据库相关表之间的参照完整性约束。 (7)学校的工资管理系统 实现部门、职务、职称等基本信息的管理; 实现教职工信息的管理; 实现工资项目的管理...

    java 面试题 总结

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    asp.net知识库

    Oracle编程的编码规范及命名规则 Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的一些基础知识 在组件之间实现事务和异步提交事务(NET2.0) 其它 在.NET访问MySql数据库时的...

    亮剑.NET深入体验与实战精要2

    本书既考虑到实际开发中经常遇到的困惑和难题,也分析了解决问题的思路和方法,更总结出项目开发中不可或缺的技术点及思想。读者可以在欣赏一个个有趣例子的过程中,不知不觉具备开发真正商业项目的能力。 本书集...

    亮剑.NET深入体验与实战精要3

    本书既考虑到实际开发中经常遇到的困惑和难题,也分析了解决问题的思路和方法,更总结出项目开发中不可或缺的技术点及思想。读者可以在欣赏一个个有趣例子的过程中,不知不觉具备开发真正商业项目的能力。 本书集...

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: ...

    网管教程 从入门到精通软件篇.txt

    小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。  Bootcfg  bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。  含有下列参数的 bootcfg 命令仅在...

Global site tag (gtag.js) - Google Analytics