Oracle 调优读书笔记二

来源:互联网 发布:ubuntu 17.04 iso安装 编辑:程序博客网 时间:2024/06/06 01:15
当某个索引包含有多个已索引的列时,我们称这个索引为组合(concatenated)索引或是复合索引。虽
然Oracle 9i 引入的跳跃式扫描索引访问方法增强了优化器在使用组合索引时的选择,但是您应该谨慎地
选择索引中的列顺序。一般来说,索引的第一列应该是最有可能在WHERE 子句中使用的列,并且也是索引
中最具选择性的列。
在引入跳跃式扫描功能之前,查询只能在WHERE 子句中使用索引的第一列时使用索引。考虑如下程序
清单中的示例,其中表EMP 有一个组合索引,该索引包含了Empno、Ename 和Deptno。注意第一部分是Empno,
第二部分则是Ename,最后是Deptno。如果没有使用跳跃式扫描功能,除非在WHERE 子句中对第一列(Empno)
指定一个值,否则Oracle 一般不会使用这个索引。
select job, empno
from emp
where ename = 'RICH';
因为Ename 不是索引的第一列,优化器可能会选择不使用该索引。随着在Oracle 9i 中引入了跳跃式
扫描功能,即使在WHERE 子句中没有指定Empno 值,优化器也可能会选择使用该索引。相反,优化器可能
会选择索引的快速全局扫描或全表扫描。
如果在WHERE 子句中使用索引的第三列,也会产生相同的情况:
select job, empno
from emp
where deptno = 30;
在该程序清单中,WHERE 子 句指定了索引中第三列的值。优化器可能选择执行索引快速扫描访问、索
引快速全局扫描或全表扫描。通过创建索引,您可以在执行查询时为数据库提供更多的选 择。从而有希望
改进整体的性能。注意,用户的代码没有改变,优化器可以识别该索引,并且根据每种替代方法的预期成
本决定使用何种方法。
在下面的示例中,使用了索引的一部分。将第一列Empno 用作WHERE 子句中的限制条件,以便Oracle
可以使用该索引。
select job, empno
from emp
where empno = 'RICH';
两种最常见的索引扫描类型是唯一扫描和范围扫描。在唯一扫描中,数据库知道索引包含一个唯一值
列表。在范围扫描中,数据库将根据查询标准从索引中返回多个值。在该示例中,emp_id1 和emp_id2 索
引没有被创建为唯一索引。Oracle 将在检索它们的值时执行范围扫描。在创建索引时,使用CREATE UNIQUE

INDEX 命令可以创建唯一索引。


更多信息请看 http://blog.sina.com.cn/vwaen



原创粉丝点击