我有一个表,其列为 status 。它是一个字符串可为空的列。我也只有该字段的索引。为什么以下查询未使用索引?
select /*+ index(m IDX_STATUS) */ * from messages m where m.status = :1
答案 0 :(得分:0)
尝试在没有命名(绑定)参数的情况下运行查询。有时那会带来很大的不同。
select * from messages m where m.status = 'P'
事实证明,您甚至不需要提示即可触发索引使用。
一个可能的解释是该列包含许多相等的值,例如90%的行具有status = 'D'
(低基数列)。现在我们可以了解Oracle,为什么它不使用索引:)它对值'D'完全没有意义,但对于其他值是合理的。我希望Oracle考虑一下我的提示(我了解得更多),但这似乎是不可能的。
通常,有一个非常有用的指南Oracle SQL Tuning Guide: The index is being ignored。仍然没有提到忽略绑定参数使问题消失的情况。这就是为什么我坚持问SO的问题。