代码之家  ›  专栏  ›  技术社区  ›  Jordan Parmer

在Oracle中,如果WHERE子句包含一些附加字段,是否仍将使用复合索引?

  •  2
  • Jordan Parmer  · 技术社区  · 15 年前

    所以假设我在一个表上有一个复合索引,它为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 回复  |  直到 15 年前
        1
  •  3
  •   dcp    15 年前

    答案是,“视情况而定”。确定这类问题的最佳方法是查看优化器计划,优化器计划将告诉您查询计划以及正在使用的索引。

    在谷歌上查看“解释计划”。

    Oracle是否会使用索引主要取决于优化器是否确定使用索引比不使用索引更昂贵。在某些情况下,优化器可能会确定不使用索引更快,而且大多数情况下,优化器是完全正确的。

    其他需要考虑的事情是确保您的表中有最新的统计信息,因为优化器就是用这些信息来确定查询计划的。

        2
  •  0
  •   Tony Andrews    15 年前

    当然, 如果 这将使用索引:

    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的查询则无法回答。