一、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、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
频繁进行数据操作的表,不要建立太多的索引;
删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
创建Oracle索引的7个注意事项
在创建Oracle索引时,有一些问题使我们需要注意的,下面就为您介绍创建Oracle索引的一些注意事项,希望对您学习创建Oracle索引方面能有所帮助。
1、一般来说,不需要为比较小的表创建索引;
2、即使是大表,如果经常需要查询的数据不超过10%到15%的话,那就没有必要为其建立索引的必要。因为此时建立索引的开销可能要比性能的改善大的多。这个比例只是一个经验的数据。如果数据库管理员需要得出一个比较精确的结论,那么就需要进行测试分析。
3、如对于一些重复内容比较少的列,特别是对于那些定义了唯一约束的列。在这些列上建立索引,往往可以起到非常不错的效果。如对于一些null值的列与非Null值的列混合情况下,如果用户需要经常查询所有的非Null值记录的列,则最好为其设置索引。如果经常需要多表连接查询,在用与连接的列上设置索引可以达到事半功倍的效果。
4、数据库管理员,需要隔一段时间,如一年,对数据库的索引进行优化。该去掉的去掉,该调整的调整,以提高数据库的性能。
5、通常来说,表的索引越多,其查询的速度也就越快。但是,表的更新速度则会降低。这主要是因为表的更新(如往表中插入一条记录)速度,反而随着索引的增加而增加。这主要是因为,在更新记录的同时需要更新相关的索引信息。为此,到底在表中创建多少索引合适,就需要在这个更新速度与查询速度之间取得一个均衡点。
6、对于一些数据仓库或者决策型数据库系统,其主要用来进行查询。相关的记录往往是在数据库初始化的时候倒入。此时,设置的索引多一点,可以提高数据库的查询性能。同时因为记录不怎么更新,所以索引比较多的情况下,也不会影响到更新的速度。即使在起初的时候需要导入大量的数据,此时也可以先将索引禁用掉。等到数据导入完毕后,再启用索引。可以通过这种方式来减少索引对数据更新的影响。相反,如果那些表中经常需要更新记录,如一些事务型的应用系统,数据更新操作是家常便饭的事情。此时如果在一张表中建立过多的索引,则会影响到更新的速度。
7、关于位图索引。
基数是位图索引中的一个基本的定义,它是指数据库表中某个字段内容中不重复的数值。如在员工信息表中的性别字段,一般就只有男跟女两个值,所以,其基数为2;婚姻状况字段的话,则其只有已婚、未婚、离婚三种状态,其基数就为3;民族一览内也是只有有限的几个值。
怎样建立最佳索引?
1、明确地创建索引
create index index_name on table_name(field_name)
tablespace tablespace_name
pctfree 5
initrans 2
maxtrans 255
storage
(
minextents 1
maxextents 16382
pctincrease 0
);
2、创建基于函数的索引
常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:
create index idx_func on emp(UPPER(ename)) tablespace tablespace_name;
3、创建位图索引
对基数较小,且基数相对稳定的列建立索引时,首先应该考虑位图索引,例:
create bitmap index idx_bitm on class (classno) tablespace tablespace_name;
4、明确地创建唯一索引
可以用create unique index语句来创建唯一索引,例:
create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;
5、创建与约束相关的索引
可以用using index字句,为与unique和primary key约束相关的索引,例:
alter table table_name
add constraint PK_primary_keyname primary key(field_name)
using index tablespace tablespace_name;
如何创建局部区索引?
1)基础表必须是分区表
2)分区数量与基础表相同
3)每个索引分区的子分区数量与相应的基础表分区相同
4)基础表的自分区中的行的索引项,被存储在该索引的相应的自分区中,例如
create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)
Pctfree 5
Tablespace TBS_AK01_IDX
Storage(
MaxExtents 32768
PctIncrease 0
FreeLists 1
FreeList Groups 1
)
local
/
如何创建范围分区的全局索引?
基础表可以是全局表和分区表
create index idx_start_date on tg_cdr01(start_date)
global partition by range(start_date)
(partition p01_idx vlaues less than ('0106')
partition p01_idx vlaues less than ('0111')
...
partition p01_idx vlaues less than ('0401'))
/
如何重建现存的索引?
重建现存的索引的当前时刻不会影响查询
重建索引可以删除额外的数据块
提高索引查询效率
alter index idx_name rebuild nologging;
对于分区索引
alter index idx_name rebuild partition partition_name nologging;
删除索引的原因?
1)不再需要的索引
2)索引没有针对其相关的表所发布的查询提供所期望的性能改善
3)应用没有用该索引来查询数据
4)该索引无效,必须在重建之前删除该索引
5)该索引已经变的太碎了,必须在重建之前删除该索引
语句:
drop index idx_name;
drop index idx_name partition partition_name;
建立索引的代价?
基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,
主要表现在CPU和I/O上。
插入、更新、删除数据产生大量db file sequential read锁等待。
相关推荐
一、Oracle全文索引的基本概念 1. 文本索引类型:Oracle提供了两种类型的全文索引,即BINARY XML索引和CTX(Context)索引。BINARY XML索引适用于XML文档,而CTX索引则适用于非XML文本。 2. CTX(Context)索引:这...
#### 一、基本索引概念 在Oracle数据库中,索引是提高数据检索速度的重要工具。通过查询`DBA_INDEXES`视图,可以获取到当前数据库中所有表的所有索引信息。需要注意的是,如果只想查看当前用户模式下的索引,应该...
Oracle Spatial是甲骨文公司推出的空间数据管理解决方案,其核心是一组专门针对Oracle数据库中空间元素的SQL模式、函数集以及空间索引机制。Oracle Spatial允许对空间数据进行存储、检索、更新和查询操作,是处理...
Oracle SQL优化是数据库管理员和开发人员提升数据库...以上是Oracle SQL优化的一些基本规则,实际操作中需要结合具体业务场景和系统负载进行调整。不断学习和实践,理解数据库的工作原理,是持续优化SQL性能的关键。
本教程将深入探讨Oracle 9i的基础知识,包括安装、配置、SQL语言、表的创建与管理、索引、存储过程、触发器、视图以及备份和恢复等核心概念。 1. **Oracle 9i的安装与配置**: - 安装:Oracle 9i的安装分为多个...
- 应在经常进行查询的列上创建索引,如果查询涉及的行数少于表总行数的15%,创建索引将带来显著性能提升。 - 索引数量应适度,过多的索引会增加数据修改时的维护工作量和存储空间需求。 5. **索引使用原则** - ...
这个压缩包文件"Oracle基本语句和基本函数.doc"显然包含了关于Oracle数据库操作的基础知识,包括SQL语句和内置函数的使用。 一、Oracle SQL基本语句 1. 数据查询:SQL的SELECT语句用于从数据库中检索数据,例如`...
视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。 视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。 视图的优点: 1.对数据库的...
它可以提供改进建议,包括创建索引、调整执行计划等。 13. **数据库设计**:良好的数据库设计是优化的基础。确保数据模型简洁,减少冗余,避免数据不一致和异常。 14. **硬件优化**:合理的硬件配置也能提升性能,...
这本书可能会涵盖数据库基础,如SQL语言的基本操作,表的创建与管理,索引,视图,存储过程,触发器,以及数据库的安全性与性能优化等内容。对于初学者,它将帮助理解Oracle数据库的基本架构和操作,为更深入的学习...
10g基本教程】是一份专为初学者设计的教程,涵盖了Oracle数据库的基础知识,包括数据库的逻辑结构、SQL语言基础、SQL函数、数据库系统概论、Oracle技术的其他方面、用户和角色的管理、网络管理和网络安全以及索引和...
### Oracle 创建表空间知识点 #### 一、Oracle 表空间概念 ...通过上述内容的学习,我们可以了解到在Oracle数据库中创建表空间的基本方法和注意事项。这对于数据库管理员来说是非常重要的技能之一。
在Oracle中,SQL不仅可以用于基本的数据操作,如查询、插入、更新和删除,还可以通过PL/SQL扩展实现更复杂的业务逻辑,比如条件判断、循环结构以及创建存储过程和触发器。 Oracle的数据类型涵盖了多种常见的数据...
在Oracle中,SQL用于创建、修改和查询数据库对象,如表、视图、索引等。Oracle还提供了PL/SQL,这是一种过程化的语言,扩展了SQL的功能,允许编写存储过程、函数、触发器等。 二、Oracle数据库基本操作 1. 数据库...
Oracle数据库是全球广泛使用的...以上只是Oracle基本语法的一部分,实际应用中还有许多其他功能和优化技巧,如索引策略、性能调优、并行执行、物质化视图等。学习Oracle语法需要不断实践和探索,才能充分掌握其精髓。
在 Oracle 数据库中,创建用户是数据库管理员(DBA)的一项基本任务。用户账户是数据库安全的第一道防线,它定义了哪些人可以访问数据库以及他们能做什么。本文将详细介绍如何在 Oracle 数据库中创建用户,并赋予相应...
本文主要探讨了Oracle索引在数据查询中的应用,包括索引的基本概念、工作原理、使用场合以及优化策略。 首先,索引是一种特殊的数据结构,类似于书籍的目录,用于快速定位表中特定行的位置。Oracle使用B-Tree结构来...