Oracle 优化经典文章 索引原理篇
Oracle 提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非
常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。而如果
做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟
得以完成,这样会使您立刻成为一位英雄。这篇文章就将简单的讨论每个索引选项。主要有
以下内容:
[1] 基本的索引概念
查询 DBA_INDEXES 视图可得到表中所有索引的列表,注意只能通过 USER_INDEXES
的方法来检索模式(schema) 的索引。访问 USER_IND_COLUMNS 视图可得到一个给定表中
被索引的特定列。
[2] 组合索引
当某个索引包含有多个已索引的列时,称这个索引为组合( concatented )索引。在
Oracle9i 引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。比如:
表 emp 有一个组合索引键,该索引包含了 empno、ename 和 deptno 。在 Oracle9i 之前除非在
where 之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫
描。
特别注意:在 Oracle9i 之前,只有在使用到索引的前导索引时才可以使用组合索引!
[3] ORACLE ROWID
通过每个行的 ROWID ,索引 Oracle 提供了访问单行数据的能力。ROWID 其实就是直
接指向单独行的线路图。如果想检查重复值或是其他对 ROWID 本身的引用,可以在任何表
中使用和指定 rowid 列。
[4] 限制索引
限制索引是一些没有经验的开发人员经常犯的错误之一。在 SQL 中有很多陷阱会使一
些索引无法使用。下面讨论一些常见的问题:
4.1 使用不等于操作符(<>、!=)
下面的查询即使在 cust_rating 列有一个索引,查询语句仍然执行一次全表扫描。
select cust_Id,cust_name
from customers
where cust_rating <> 'aa';
把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于
代价的优化器(更智能)时,将会使用索引。
select cust_Id,cust_name
from customers
where cust_rating < 'aa' or cust_rating > 'aa';
特别注意:通过把不等于操作符改成 OR 条件,就可以使用索引,以避免全表扫描。
4.2 使用 IS NULL 或 IS NOT NULL
使用 IS NULL 或 IS NOT NULL 同样会限制索引的使用。因为 NULL 值并没有被
定义。在 SQL 语句中使用 NULL 会有很多的麻烦。因此建议开 发人员在建表时,把
评论0
最新资源