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

Sql 巨大的性能差异:使用sysdate与使用预格式化日期,sql,performance,oracle,oracle9i,Sql,Performance,Oracle,Oracle9i,为什么这两个查询之间存在如此巨大的性能差异 -- (89 seconds) SELECT max(mydate) FROM mytable WHERE eqpid = 'ABCDEFG' AND mydate < sysdate - 5 vs 不管索引如何,似乎to_date和sysdate都只返回一些日期值 注:此表上存在一个复合索引,包括eqpid和其他两列。 mydate也有索引。两者都是b-树。大约有2900万行 为什么优化器会选择这样一个明显不同的,在某种情况下是糟糕的计划呢?

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

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

不管索引如何,似乎to_date和sysdate都只返回一些日期值

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


为什么优化器会选择这样一个明显不同的,在某种情况下是糟糕的计划呢?

我不知道Oracle,但在Postgresql中,忽略索引的一个可能原因是类型不匹配。也许做直线-5会让甲骨文认为rhs是数字。你能在sysdate-5上对mydate的确切类型进行转换吗?

Jonathan Lewis在9i中写过有关sysdate的问题;例如,请查看“令人惊讶的系统日期”部分。本质上,sysdate上的算法似乎混淆了优化器,因此在本例中,它认为mydate上的索引更有选择性。不过,这似乎是一个非常极端的例子。最初是从一篇不太相关的Ask Tom帖子中指向这个方向的。

eqpid索引中的列列表是什么?列列表中是否有带eqpid的组合索引?如果是这样的话,Oracle可能会认为它不是一个有效的类型索引,因此它会惩罚该计划。@b问题:本例中的复合主键包括3列:eqpid varchar2 8 byte、rectype varchar1 1 byte、serialnobyte number。我的理解是eqpid,键中的第一个,可以使用索引。是的,它应该能够这样做,并且在第二个查询中做到了。但是很明显,这个eqpid有很多行,当它认为有其他选择时,它一定会避开它。优化器可以做奇怪的事情。但是当我需要让MySQL运行复杂的查询时,我就错过了它。我很惊讶,甚至Oracle也让它通过了QA。+1,我隐约记得读过这篇文章,但找不到参考资料-你的意思是更具选择性,而不是更少选择性?@b蒂莉-呃,是的。更正。谢谢
-- (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