本节介绍以下内容:
■编写使用索引的语句
■编写避免使用索引的语句
■重新创建索引
Ordering Keys for Composite Indexes
按照以下准则对复合索引中的键进行排序:
■创建索引,以便WHERE子句中使用的键构成一个前导部分。
■如果某些键更频繁地出现在WHERE子句中,则创建索引,以便更频繁选择的键构成一个前导部分,以允许仅使用这些键的语句使用索引。
■如果所有键都经常出现在WHERE子句中,但数据在其中一个键上进行了物理排序,则将此键首先放在复合索引中。
编写使用索引的语句
即使在创建索引之后,优化器也不能仅仅因为索引存在而使用使用索引的访问路径。仅当SQL语句包含使访问路径可用的构造时,优化器才能为SQL语句选择此类访问路径。要允许查询优化器使用索引访问路径,请确保该语句包含使这种访问路径可用的构造。
编写避免使用索引的语句
在某些情况下,您可能希望阻止SQL语句使用使用现有索引的访问路径。如果您知道索引不是非常有选择性并且全表扫描更有效,您可能希望采用这种方法。如果语句包含使这种索引访问路径可用的构造,则可以强制优化器通过以下方法之一使用全表扫描:
■使用NO_INDEX提示为查询优化器提供最大的灵活性,同时禁止使用某个索引。
■使用FULL提示指示优化程序选择全表扫描而不是索引扫描。
■使用INDEX或INDEX_COMBINE提示指示优化程序使用一个索引或一组列出的索引而不是另一个索引。
并行执行有效地使用索引。它不执行并行索引范围扫描,但它确实为并行嵌套循环连接执行执行并行索引查找。如果索引非常有选择性(每个索引条目的行数很少),那么使用顺序索引查找而不是并行表扫描可能会更好。
重新创建索引
您可能希望重新创建索引以压缩它并最小化碎片空间,或者更改索引的存储特征。在创建作为现有索引子集的新索引或重建具有新存储特征的现有索引时,Oracle数据库可能会使用现有索引而不是基表来提高索引构建的性能。
但是,在某些情况下使用基表而不是现有索引是有益的。考虑一个表上的索引,在该表上已经执行了很多DML。由于DML,索引的大小可以增加到每个块仅满50%或甚至更少的点。如果索引引用表中的大多数列,则索引实际上可能大于表。在这种情况下,使用基表而不是索引来重新创建索引会更快。
使用ALTER INDEX ... REBUILD语句重新组织或压缩现有索引或更改其存储特征。 REBUILD语句使用现有索引作为新索引的基础。支持所有索引存储语句,例如STORAGE(用于扩展区分配),TABLESPACE(用于将索引移动到新的表空间)和INITRANS(用于更改初始条目数)。
通常,ALTER INDEX ... REBUILD比删除和重新创建索引更快,因为此语句使用快速全扫描功能。它使用多块I / O读取所有索引块,然后丢弃分支块。此方法的另一个优点是旧的索引在重建过程中仍可用于查询。
压缩索引
您可以使用带有COALESCE选项的ALTER INDEX语句来合并索引的叶块。此选项允许您将索引的叶级别组合为空闲块以供重用。您还可以在线重建索引。