2011-06-01 6 views
8

なぜこれらの2つのクエリのパフォーマンスには大きな違いがありますか?大きなパフォーマンスの違い:sysdateを使用してフォーマット済みの日付を使用する

-- (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ツリーです。約2,900万行があります。

オプティマイザがなぜこれらの明らかに異なる計画を選択するのでしょうか?

+1

'eqpid'のインデックスの列のリストは何ですか? Isは 'eqpid'を列のリストの下に組み合わせたインデックスですか?そうであれば、オラクルは使用する効率的な型索引ではないと考えて、その計画に不利益を与えます。 – btilly

+0

@btilly:この場合の複合主キーには、eqpid(varchar2 8バイト)、rectype(varchar1 1バイト)、serialnobyte(number)の3つの列があります。キーの最初のeqpidがインデックスを使用できるのは私の理解です。 –

+0

ええ、そうすることができるはずですし、2番目のクエリでしました。しかし、あなたは明らかに、そのeqpidで多くの行を持っています、そして、それはそれが別のものを持っていると思ったとき、それから離れていたに違いありません。オプティマイザは奇妙なことをすることができます。 (ただし、MySQLが複雑なクエリを実行する必要があるときは、私はそれを逃しています。) – btilly

答えて

6

ジョナサンルイスは9iでsysdateの問題について書いています。例えば、「驚くべきsysdate」セクションhereを見てください。基本的にsysdateの算術演算はオプティマイザを混乱させるようです。この場合、mydateのインデックスがより選択的だと思います。しかしこれは非常に極端な例のようです。 (もともと、実際には関係のないAsk Tomの投稿からこの方向に指摘されていました)。

+1

私はOracleにもQAを手放すことに驚いています。 –

+0

+1、私は漠然とこのことを思い出していましたが、参照を見つけることができませんでした;-) – DCookie

+0

あなたはそれほど選択的ではなく、より選択的ですか? – btilly

1

オラクルは分かりませんが、Postgresqlではインデックスを無視する可能性のあるソースが不一致です。たぶんストレート- 5を実行すると、rhsが数値であるとOracleが判断します。キャスト・トゥー・デート(正確なタイプのmydate)はsysdate - 5にありますか?

関連する問題