在Oracle中,如果where子句包含一些其他字段,是否还会使用复合索引?

时间:2010-03-05 17:40:39

标签: sql oracle

因此,假设我在一个索引4个字段的表上有一个复合索引。

create index idx_comp_index
on mytable ( fielda, fieldb, fieldc, fieldd );

如果我使用where子句中的所有四个字段加上一个或两个附加字段来查询该表,是否仍会使用索引?

select *
from mytable
where fielda = 'i'
  and fieldb = 'love'
  and fieldc = 'vim'
  and fieldd = 'so'
  and fielde = 'much';  -- additional field not indexed

2 个答案:

答案 0 :(得分:3)

答案是“它取决于”。确定此类事情的最佳方法是查看优化器计划,该计划将告诉您查询计划以及正在使用的索引。

在google上查看“解释计划”。

Oracle是否会使用索引主要归结为优化器是否确定使用索引比使用索引更昂贵。在某些情况下,优化器可能会确定不使用索引的速度更快,并且大多数情况下,优化器完全正确。

要考虑的其他事项是确保您拥有关于表的最新统计信息,因为这是优化程序用于确定查询计划的内容。

答案 1 :(得分:0)

当然, if 这会使用索引:

select *
from mytable
where fielda = 'i'
  and fieldb = 'love'
  and fieldc = 'vim'
  and fieldd = 'so';

然后我认为没有理由不这样做:

select *
from mytable
where fielda = 'i'
  and fieldb = 'love'
  and fieldc = 'vim'
  and fieldd = 'so'
  and fielde = 'much';  -- additional field not indexed

如果不是“select *”而是“select fielda”,那么没有fielde的查询可能只使用索引来回答,而fielde的查询则不能。