Oracle 如何处理复合索引查找?

Der*_*ney 3 index oracle

MySQL不能在WHERE条件不包括构成最左边前缀的列的查找中使用复合索引:

如果列不构成索引的最左边前缀,MySQL 不能使用索引来执行查找。

来自这个关于 PostgreSQL 的回答的引述引起了我的注意:

这在 Oracle 11 中有些不同,它有时也可以使用不在索引定义开头的列。

在什么情况下 Oracle(至少在 11g 中)可以在查询中不存在最左侧前缀列的情况下进行查找?

Uwe*_*sse 6

在 Oracle 中,我们有一个称为索引跳过扫描的功能,即使在 WHERE 条件中未指定索引的前导(最左侧)部分,也可以从复合索引中受益。这是9i 新功能,记录在此处:http : //download.oracle.com/docs/cd/B10501_01/server.920/a96533/optimops.htm


Jac*_*las 5

简而言之,CBO 可以选择:

  1. 为“缺失”的前导列建立一个所有可能值的列表(这可以从索引结构本身相当有效地完成)
  2. 对缺失的列和提供的列的每个组合迭代执行范围扫描
  3. 在一个结果集中将所有内容结合在一起

这就是 Oracle 术语中所谓的“跳过扫描”。当步骤 (1) 中可能值的数量相对较小(与索引的大小相比较小)时,跳过扫描效果最佳

在什么情况下 Oracle(至少在 11g 中)可以在查询中不存在最左侧前缀列的情况下进行查找?

如果执行那么多范围扫描比顺序扫描整个索引花费更多,Oracle 将在权衡之前使用统计信息来估计步骤 (1) 的基数