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

时间:2011-06-01 21:24:19

标签: sql performance oracle oracle9i

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

-- (89 seconds)
SELECT max(mydate) FROM mytable WHERE eqpid = 'ABCDEFG'
AND mydate < sysdate - 5

VS

-- (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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

我不知道Oracle,但在Postgresql中忽略索引的可能来源是不匹配的类型。也许做直- 5使得Oracle认为rhs是数字的。你可以在sysdate - 5上进行迄今为止的演员表演(或者完全类型的mydate)吗?