为什么这两个查询之间存在如此巨大的性能差异?巨大的性能差异:使用sysdate vs使用预格式化日期
-- (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和其他两列。 mydate也存在索引。两者都是B型树。大约有2900万行。
为什么优化器会为这些计划选择一个明显不同的(并且在某种情况下是可怕的)计划?
“eqpid”索引中的列表是什么?是列表列下的“eqpid”组合索引?如果是这样,那么Oracle可能会认为它不是一个有效的类型索引,因此它会惩罚该计划。 – btilly 2011-06-01 21:47:05
@btilly:这种情况下的组合主键包括3列:eqpid(varchar2 8字节),rectype(varchar1 1字节),serialnobyte(数字)。我的理解是,eqpid是关键中的第一个可以使用索引。 – 2011-06-02 14:08:25
是的,它应该能够这样做,并在第二个查询中完成。但是你显然有很多这种eqpid的行,当它认为它有另一种选择时它肯定会回避它。优化器可以做奇怪的事情。 (但是当我需要让MySQL运行复杂的查询时,我很想念它。) – btilly 2011-06-02 14:47:22