代码之家  ›  专栏  ›  技术社区  ›  3bdl1

如果where子句包含未编制索引的列,则使用索引吗?

  •  2
  • 3bdl1  · 技术社区  · 7 年前

    我正在使用具有以下索引的表:

    ind1 : column A,B,C,D
    ind2 : column G
    ind3 : column C
    ind4 : column F
    ind5 : column D
    ind6 : column E
    

    在我的查询中,我使用以下选择条件:

    SELECT * FROM table WHERE
        A=a
    AND B=b
    AND C=c
    AND D=d
    AND E=e
    AND F=f
    AND H=h  (H does not have an index)  
    

    我的问题是是否使用表的索引,如果在这个查询中性能得到增强,请注意,该表总共包含12列和32m条记录。

    1 回复  |  直到 7 年前
        1
  •  0
  •   wolφi    7 年前

    是的,查询几乎肯定会使用其中一个索引来预先选择哪些行可能至少填满某些条件。为了检查where子句对于未编制索引的列(如您的列h)是否为true,oracle只检查表本身。由于索引指向表的正确物理位置,这通常非常快。

    使用哪种索引,取决于许多因素,如表的大小、索引的大小、表列的唯一性、索引的唯一性、列值的数据分布等。

    要查看查询中使用了哪些索引,请查看执行计划,例如,您可以在sql developer中按f10来查看该计划。

    编辑:根据我的经验,Oracle选择最有前途的索引(这将最大程度地减少行数),然后检查 WHERE 从句按这样的表查。

    请确保该表的统计数据是最新的。如有疑问,请咨询

    SELECT table_name, last_analyzed FROM USER_TABLES;
    

    如果上次分析的数据为空或是旧数据,请搜索dbms_stats.gather_table_stats以刷新数据。

    推荐文章