なぜこれらの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万行があります。
オプティマイザがなぜこれらの明らかに異なる計画を選択するのでしょうか?
'eqpid'のインデックスの列のリストは何ですか? Isは 'eqpid'を列のリストの下に組み合わせたインデックスですか?そうであれば、オラクルは使用する効率的な型索引ではないと考えて、その計画に不利益を与えます。 – btilly
@btilly:この場合の複合主キーには、eqpid(varchar2 8バイト)、rectype(varchar1 1バイト)、serialnobyte(number)の3つの列があります。キーの最初のeqpidがインデックスを使用できるのは私の理解です。 –
ええ、そうすることができるはずですし、2番目のクエリでしました。しかし、あなたは明らかに、そのeqpidで多くの行を持っています、そして、それはそれが別のものを持っていると思ったとき、それから離れていたに違いありません。オプティマイザは奇妙なことをすることができます。 (ただし、MySQLが複雑なクエリを実行する必要があるときは、私はそれを逃しています。) – btilly