Oracle 创建索引的基本规则总结
今天面试的时候被问到与这个相关的问题,突然就是想不全了,很囧,回来特此总结一下
一、B-Tree索引
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索引要好
三、索引和NULL
NULL值在索引中是被看做一个独特值的除非当一个索引的两行或多行的NON-NULL值是相等的情况下.在那种情况下,行被看做是相等的,因此,唯一索引不允许行包含空值以怕被看做是相等的.但是,当所有的行都是空值时,这个规则就不适用.ORACLE并不索引所有健值都为NULL的表的行,除非是位图索引或当主键字段值是NULL时
四、建立索引常用的规则如下
- 表的主键、外键必须有索引;
- 数据量超过300的表应该有索引;
- 经常与其他表进行连接的表,在连接字段上应该建立索引;
- 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
- 索引应该建在选择性高的字段上;
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
- 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
- 频繁进行数据操作的表,不要建立太多的索引;
- 删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
转载之http://blog.csdn.net/leishifei/article/details/6651523
分享到:
相关推荐
掌握SQL的基础语法,如SELECT、INSERT、UPDATE、DELETE语句,以及联接(JOIN)、子查询、聚合函数(COUNT、SUM、AVG等)和分组(GROUP BY)等,是每个Oracle开发者的基本功。 二、创建表 创建表是数据库设计的第一...
3. **创建语法**:创建B树索引的基本语法是:`CREATE INDEX index_name ON table_name (column_name);`,函数索引则需指定函数:`CREATE INDEX func_index ON table_name (function(column_name));` 4. **常见使用...
### Oracle基础知识总结初学者必备 Oracle数据库作为一款广泛使用的数据库管理系统,在企业和开发领域扮演着重要的角色。对于初学者而言,掌握其基础知识是非常必要的。本文将根据提供的内容进行深入解析,并结合...
7. **创建索引**:创建索引可以加速对表中特定列的查询。例如,`CREATE INDEX index_name ON table_name(column_name);` 创建基于`column_name`的索引`index_name`。 8. **创建表分区**:分区是将大表分解成更小、...
例如,在MySQL中,可以使用CREATE INDEX语句来创建索引,而在Oracle中,需要使用CREATE INDEX语句来创建索引,并可以使用alter table语句来修改索引。 五、视图 MySQL和Oracle都支持视图机制,但是它们的视图创建...
这篇总结将深入探讨Oracle的一些关键知识点,包括登录模式的区别、Blob字段处理、数据库级触发器、子程序和表类型、XML集成、归档日志恢复、SQL与Oracle函数差异以及RDBMS的基本概念。 1. **登录模式的区别**: - ...
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资料(语句总结版)”中涉及的关键知识点,帮助初学者快速掌握Oracle的基本操作和SQL语言。 1. **SQL基础**:SQL(结构化查询语言)是用于管理关系数据库的标准语言。在Oracle中,SQL主要...
通过上述实验,学习者不仅掌握了基本的数据库操作,还体验到了问题解决的过程,这对于后续深入学习Oracle数据库和数据库管理至关重要。随着经验的积累,可以进一步探索触发器、索引、视图、事务控制等更复杂的数据库...
- **了解Oracle的基本功能**:通过实际操作,让学生对Oracle的基本功能有直观的认识。 - **掌握SQL*PLUS的使用**:学习SQL*PLUS的基本命令和技术,为后续更复杂的数据库操作打下基础。 - **深入理解PL/SQL**:通过PL...
本文将深入讲解Oracle数据库的基础命令,涵盖数据库的基本概念、关系数据库模型、数据操作语言(DDL、DML、DCL)以及数据库设计方法。 首先,理解数据库基础至关重要。数据库是一个组织和存储数据的系统,它允许...
本资料"Oracle基本操作_整理.rar"包含了作者个人的学习经验和总结,旨在帮助初学者和有一定基础的用户更好地理解和掌握Oracle数据库的操作。 1. **安装与配置**: - Oracle的安装分为客户端和服务器端,需要根据...
- **索引优化**:创建索引的原则、索引类型选择、索引维护策略。 - **备份与恢复**:备份策略设计、RMAN工具使用、灾难恢复计划制定。 #### 3. 性能调优 - **SQL性能调优**:执行计划分析、索引使用情况检查、SQL...
创建索引的基本语法如下: ```sql CREATE INDEX index_name ON table_name (column1, column2, ...); ``` 其中`index_name`是索引的名称,`table_name`是要创建索引的表名,`column1, column2, ...`是要包含在索引中...
预处理数据,如清理目标表或创建索引。 - **通过unix/Linux PIPE管道加快exp/imp速度:** 使用管道而非文件传输数据,减少I/O操作。 - **全库导入的一般步骤:** 1. 停止所有应用,确保数据一致性。 2. 执行全库...
- **整体视角与十大交付物**:从全局角度出发,总结了作为一位Oracle DBA应该掌握的核心技能集,明确了成功的数据库管理员所应具备的能力。 #### 五、数据库调优 - **数据库调优**:介绍了数据库层面的性能优化...
创建索引的基本语法如下: ```sql CREATE INDEX index_name ON table_name (column1, column2, ...); ``` **1.2.1.2 索引特点** - **加快查询速度**:通过索引可以快速定位到数据表中的特定记录,从而显著提高...
本课程通过深入学习和实践,使学生掌握了ORACLE数据库的设计原则、管理技巧和安全策略,为今后的毕业设计和实际工作打下了坚实基础。 在实际的数据库设计中,需要结合业务需求,合理规划表结构,有效利用索引,确保...