代码之家  ›  专栏  ›  技术社区  ›  Jarekczek

Oracle没有在简单查询中使用索引,尽管有提示

  •  0
  • Jarekczek  · 技术社区  · 7 年前

    我有一张有柱子的桌子 地位 . 它是一个可为null的字符串列。我也只有这个领域的索引。为什么下面的查询没有使用索引?

    select /*+ index(m IDX_STATUS) */ * from messages m where m.status = :1
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Jarekczek    7 年前

    尝试运行不带命名(绑定)参数的查询。有时候这会有很大的不同。

    select * from messages m where m.status = 'P'
    

    结果可能根本不需要提示就可以触发索引的使用。

    status = 'D' ( 低基数列 ). 现在我们可以理解Oracle为什么不使用索引:)它在值'D'上没有意义,但是对于其他值是合理的。我宁愿甲骨文考虑我的暗示( ),但这似乎是不可能的。

    总的来说,有一个非常有用的指南 Oracle SQL Tuning Guide: The index is being ignored . 尽管如此,它并没有提到省略bind参数会使问题消失的情况。所以我坚持要问这个问题。