查询可以使用同一个表中的多个索引吗?

时间:2015-11-03 09:29:37

标签: oracle oracle12c

我的问题类似于this one,但差别很小。我在一个包含多个WHERE条件的表上运行查询。

假设我的表有多列(col1-col9),我有一个类似的查询:

SELECT
    col1
    , col5
FROM table1
WHERE col1 = 'a'
    AND col2 = 'b'
    AND col3 = 100
    AND col4 = '10a'
    AND col5 = 1

我的索引是:

  • col1 - 唯一/非分区
  • col2,col3 - 非唯一/分区
  • col4,col5 - 非唯一/分区

我的问题是,如果我在我的WHERE子句中使用涵盖多个索引的列,那么(应该?)查询将首先选择唯一索引以生成结果集然后在该结果集上使用其他两个索引进行进一步过滤,依次减少结果集?

或者每个索引会覆盖表中的整个数据,每个条件都会使用索引,然后合并所有结果集吗?

我无权访问表格/数据,这比理论上更实用)。

提前感谢您的任何帮助

1 个答案:

答案 0 :(得分:3)

Oracle优化器(在更新版本的Oracle中,除非你强制它以其他方式运行)是基于成本而不是基于规则的。首次执行查询时,它将考虑许多不同的路径来获得答案,并选择成本最低的路径。

因此,通常不可能提前说出数据库将如何选择回答特定查询。答案永远是 - 这取决于。这取决于

  • 表格的统计信息以及每列上不同值的数量
  • 您正在使用的数据库版本
  • 系统和会话参数
  • 指数统计

一般来说,在大多数情况下它会做的是选择最具选择性的索引。因此,如果您只有一行或两行,其中col1 =' a',它可能会进入该索引,然后扫描其中的行。

正如其他答案所提到的,数据库可以通过位图转换阶段组合B-Tree索引。这是相对昂贵的,并非在所有Oracle版本中都可用,但它可能会发生。

总而言之,数据库可以执行您提到的任何一种方法。知道 在您的环境中做什么的唯一方法是使用解释计划或等效工具来观察它的作用