一个查询可以使用来自同一个 table 的多个索引吗?
Can a query use multiple indexes from the same table?
我的问题与this one类似,但有细微差别。我在具有多个 WHERE
条件的单个 table 上有一个查询 运行。
假设我的 table 有多个列(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
子句中使用涵盖多个索引的列,查询是否会(应该?)首先选择唯一索引生成结果集,然后在该结果集上使用另外两个索引进一步过滤,依次缩减结果集?
或者每个索引遍历 table 中的整个数据并且每个条件将使用一个索引然后合并所有结果集?
(我无法访问 table/data,这是理论多于实际)。
提前感谢您的帮助
Oracle 优化器(在较新版本的 Oracle 中,除非您强制它以其他方式运行)是基于成本而不是基于规则的。当查询第一次执行时,它会考虑许多不同的路径来获得答案,并选择成本最低的路径。
因此通常不可能提前说出数据库将如何选择回答特定查询。答案总是——视情况而定。这取决于
- table 的统计信息,以及每列中不同值的数量
- 您使用的数据库版本
- 系统和会话参数
- 指数统计
一般来说,大多数情况下它会做的是选择最有选择性的索引。因此,如果您只有一两行 col1='a',它可能会进入该索引,然后扫描其中的行。
正如另一个答案提到的,数据库可以通过位图转换阶段来组合B-Tree索引。这是相对昂贵的,并且并非在所有 Oracle 版本中都可用,但它可能会发生。
总之,数据库可以执行您提到的任何一种方法。了解它 将 在您的情况下做什么的唯一方法是使用解释计划或等效工具来观察它的作用
我的问题与this one类似,但有细微差别。我在具有多个 WHERE
条件的单个 table 上有一个查询 运行。
假设我的 table 有多个列(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
子句中使用涵盖多个索引的列,查询是否会(应该?)首先选择唯一索引生成结果集,然后在该结果集上使用另外两个索引进一步过滤,依次缩减结果集?
或者每个索引遍历 table 中的整个数据并且每个条件将使用一个索引然后合并所有结果集?
(我无法访问 table/data,这是理论多于实际)。
提前感谢您的帮助
Oracle 优化器(在较新版本的 Oracle 中,除非您强制它以其他方式运行)是基于成本而不是基于规则的。当查询第一次执行时,它会考虑许多不同的路径来获得答案,并选择成本最低的路径。
因此通常不可能提前说出数据库将如何选择回答特定查询。答案总是——视情况而定。这取决于
- table 的统计信息,以及每列中不同值的数量
- 您使用的数据库版本
- 系统和会话参数
- 指数统计
一般来说,大多数情况下它会做的是选择最有选择性的索引。因此,如果您只有一两行 col1='a',它可能会进入该索引,然后扫描其中的行。
正如另一个答案提到的,数据库可以通过位图转换阶段来组合B-Tree索引。这是相对昂贵的,并且并非在所有 Oracle 版本中都可用,但它可能会发生。
总之,数据库可以执行您提到的任何一种方法。了解它 将 在您的情况下做什么的唯一方法是使用解释计划或等效工具来观察它的作用