查询是否一次使用多个索引?

时间:2010-11-07 05:09:43

标签: sql oracle

如果我在不同的列上有一个索引表,那么数据库在执行查询时是否会使用这两个索引?另外,如果我有4列的索引,另一列的附加索引,对所有5列的查询是否可以使用这个第二个索引,还是在匹配第一个索引后它只是一个区域扫描?

4 个答案:

答案 0 :(得分:2)

  

如果我的表有一个不同列的索引,那么数据库在执行查询时是否会使用这两个索引?

如果基于成本的查询优化器确定使用多个索引更有效,,它会。如果进行扫描效率更高(通常是这样),那么即使您认为应该进行扫描,也可能不会使用索引。

  

此外,如果我有4列的索引和另一列的附加索引,对所有5列的查询是否可以使用此第2个索引,或者在匹配第一个索引后它只是一个区域扫描?

同样,如果优化器认为这样做是有效的,那么它会对同一个查询使用其他索引。如果它确定索引的成本更高......它将忽略它。这一切都取决于它是否具有选择性(或者更确切地说,优化器认为的选择性,基于最新的统计数据)是否会使用索引。如果它没有选择性(不会对结果进行多大缩小),它可能会忽略它。

答案 1 :(得分:2)

它取决于优化器和查询,但优化器相对很少在单个查询中的单个表上使用两个单独的索引。在他们可能甚至可能的情况下构建示例是完全可行的 - 有些人可能实际上这样做。考虑:

  • UNION查询,其中单独的术语在不同列上具有过滤器(但表扫描可能同样有效)
  • 自联接,其中自联接的各个侧面具有不同的过滤器。

但是,要小心指责优化器不高效 - 通过其他方法解析查询可能仍然有优势。


回答你的'4列索引'问题:这是不太可能的。在这种情况下,4列索引可能提供良好的选择性,并且通过将额外的过滤条件应用于索引扫描检索的行,可以最轻松地解析查询。 (请注意,答案可能会有所不同,具体取决于额外条件是否通过AND(如我所假设)或OR(使用第二个索引可能有用)连接到另一个条件。

答案 2 :(得分:0)

这取决于针对这些表发出的查询,表的大小以及索引列中数据的选择性。

优化程序使用统计信息来确定使用索引是否有益。

答案 3 :(得分:0)

  

1.IF我有一个表,每个表都有一个不同列的索引,数据库在执行查询时是否曾使用这两个索引?

当然可以,例如,如果你有表

  • 员工(

    id(index1)

    名称

    地址

    日期(index2))

和表格

  • 任务(

    id

    employee_id(index3)

    日期(索引4)

    类别

    描述)

如果您进行查询:

  • 选择 EMPLOYEE_ID,日期,类别,描述 来自EMPLOYEE,TASKS在哪里 EMPLOYEE.id = employee_id和 EMPLOYEE.date = TASKS.date

这将列出每天每个员工的所有任务以及用户index1和index2以及index4和index3。如果我缺少index1或index2,那将花费更多的时间。

  

2.如果我有4列的索引和另一列的附加索引,对所有5列的查询是否可以使用此第2个索引,或者只是在匹配第一个索引后进行区域扫描?

当然可以这样做,但查询应该包括4列索引和单列索引的连接。