
索引
索引基本概念
当访问表中数据时,Oracle 提供了两种方式:从表中读取所有行(即全表扫描),或者
通过 Rowid 一次读取一行。当访问大数据量表中的少量行时,你可能想使用索引。例如如果
只访问大数据量表中的 5%的行,并且可以使用索引标识需要读取的数据库,这样花费的 I/O
较少。如果没有使用索引,就要读取表中所有的数据块。
索引对性能改进的程度取决于数据的选择性以及数据在标的数据块中的分布方式。如果
数据选择性很好,那么表中将只有很少的行匹配一个索引值(例如护照号码)。Oracle 将能
够快速查询索引,找到匹配的 Rowid,从而快速查到表中相应的少量数据块。如果数据选择
性不好(例如国家名),那么对一个值索引为可能返回多个 Rowid,导致从表中查询许多不
连续的数据块。
如果数据库选择性很好,但是相关的行在表中的物理存储位置并不相互靠近,这种情况
下,索引带来的好处就会大打折扣。如果匹配索引值的数据分散在表的多个数据块中,就必
须从表中把每个数据块都选出来以得到需要的查询结果。在一些情况下,你会发现当数据分
散在表的多个数据块时,最好是不使用索引,而是选择全表扫描。执行全表扫描时,Oracle
使用多块读取以快速扫描表。基于索引的读是单块读(基本上),因此在使用索引是的目标
是减少完成查询所需的单块读的数量。
通 过 对 Oracle 一 些 可 用选 项 的 利 用 , 比 如 分 区 、 并 行 DML 、 并 行 查 询 以 及 调 整
DB_FILE_MULTIBLOCK_READ_COUNT 进行更大的 I/O 操作,全表扫描和索引查找之间的平和
点正发生着变化。硬件更为快捷,可以在磁盘的高速缓存中缓存更多的信息,内存也变得更
为廉价。与此同时,Oracle 已经增强的索引特性,包括跳跃式扫描索引和其他内部操作作用
来减少返回数据所需要的时间。
注意:当升级 ORACLE 版本时,确保确实应用程序中的查询以确定查询的执行路径是否仍然
使用在升级前使用的索引。看看执行计划是否改变,这种改变的效果是变好还是变差了。
一般来说,索引能提高查询的性能。SELECT 语句、UPDATE 和 DELETE 命令的 WHERE 字
句的性能(当访问的行较少时)可以借助索引获得提高。一般来说,增加索引降低 INSERT
语句的性能(因为需要同时对表和索引进行操作)。索引列上的 UPDATE 操作将会比没有索
引慢很多,因为数据库必须管理对表和索引的改动。因此,大量行的 DELETE 操作将会有表
中存在索引而变慢。
一条删除表中一般数据的 DELETE 语句同时需要删除所有这些行对应的索引(这种情况
是非常耗时的)。通常来说,在表上加一个索引都会使该表上的 INSERT 操作的执行时间变
成原来的三倍。再加一个索引就会在再慢一倍。然而,一个由两列组成的索引并不比只有一
个列的索引差很多。索引列的 UPDATE 和 DELETE 操作同样也会变慢你需要平衡索引带来的
查询性能的提升和对数据修改性能的影响。
通过查询 DBA_INDEXES 视图可以获得一个表上所有的索引的清单,也可以通过访问
USER_INDEXES 视图查询当前方案(schema)的索引。查询 ALL_INDEXES 视图可以查看能够
访问的所有表的索引。
例如,在一张随着 ORACLE 产品一起提供的演示表 emp 上创建两个索引。
create table emp_test as select * from scott.emp;
create index emp_id1 on emp_test(empno, ename,deptno);
create index emp_id2 on emp_test(sal);
评论