索引跳过扫描第二列的where子句中的2值

时间:2017-01-02 14:25:06

标签: performance indexing oracle11g sql-tuning

我在(SWcode,cdcardno)

上创建了一个索引

我运行此查询:

SELECT cd.*
  FROM KS cd
  where cd.cdcardno in ('6219862012953805')
 ORDER BY cd.ROWID

和oracle使用索引跳过扫描,这是真的。但是当我运行这个查询时:

SELECT cd.*
  FROM KS cd
  where cd.cdcardno in ('6219861009150391','6219862012953805')
 ORDER BY cd.ROWID
oracle使用全扫描。我不明白为什么。

2 个答案:

答案 0 :(得分:0)

有时甲骨文在两个执行计划之间抨击,当其中一个是坏的而另一个更糟糕的时候。创建一个索引,其中cdcardno位于列表中的第一个位置。或者只是翻转当前索引中列的顺序。

答案 1 :(得分:0)

优化器将根据成本生成执行计划。而这又基于统计数据。除非您提供一些诊断数据,例如SQL监视器报告,否则您将收到的答案将是猜测。