爲什麼這兩個查詢之間存在如此巨大的性能差異?巨大的性能差異:使用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