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

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


-- (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和另外2列。
mydate也存在一个索引。两者都是b树。大约有2900万行。

为什么优化器会为这些选择如此明显不同的方案(有时甚至是糟糕的方案)?

最佳答案

乔纳森·刘易斯(Jonathan Lewis)在9i中撰写了有关sysdate的问题;例如,查看“令人惊讶的日期”部分here。从本质上讲,sysdate上的算法似乎使优化器感到困惑,因此在这种情况下,它认为mydate上的索引更具选择性。不过,这似乎是一个极端的例子。 (最初从与您无关的Ask Tom帖子中指出了这个方向)。

关于sql - 性能差异大: Using sysdate vs using pre-formatted date,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6207888/

10-12 21:32