大的性能差异:使用sysdate与使用预先格式化的日期

Cha*_*rns 8 sql oracle performance oracle9i

为什么这两个查询之间存在如此巨大的性能差异?

-- (89 seconds)
SELECT max(mydate) FROM mytable WHERE eqpid = 'ABCDEFG'
AND mydate < sysdate - 5
Run Code Online (Sandbox Code Playgroud)

-- (0.6 seconds)
SELECT max(mydate) FROM mytable WHERE eqpid = 'ABCDEFG'
AND mydate < TO_DATE('05/27/2011 03:13:00', 'MM/DD/YYYY HH24:MI:SS') -- 5 days ago
Run Code Online (Sandbox Code Playgroud)

无论索引如何,似乎to_date和sysdate都只返回"某个日期值".

注意:此表上存在一个复合索引,包括eqpid和另外两列.mydate也存在索引.两者都是b树.大约有2900万行.

为什么优化器会选择这些明显不同的(在一种情况下,可怕的)计划?

Ale*_*ole 6

Jonathan Lewis写过关于sysdate9i的问题; 看看在"令人惊讶的SYSDATE"部分在这里,例如.本质上,算术sysdate似乎混淆了优化器,因此在这种情况下,它认为索引mydate更具选择性.这似乎是一个非常极端的例子.(最初从一个与真正无关的Ask Tom帖子指向这个方向).