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

时间:2018-10-24 17:40:20

标签: oracle

我有一个表,其列为 status 。它是一个字符串可为空的列。我也只有该字段的索引。为什么以下查询未使用索引?

select /*+ index(m IDX_STATUS) */ * from messages m where m.status = :1

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的问题。