数百万のエントリを持つ SQL テーブルがあり、60 日より古いエントリの数をクエリしようとしました (Oracle 11.2.0.1.0)。
この実験では、選択ステートメントの 3 つの異なるバージョンを使用しました:
(コスト値は、Oracle V. 9.7.2.5 の TOAD によって与えられます)
select count(*) from fman_file
where dateadded >= (select sysdate - 60 from dual)
コスト: 65select count(*) from fman_file
where dateadded >= sysdate - 60
コスト: 1909select count(*) from fman_file
where dateadded >= sysdate - numtodsinterval(60,'day')
コスト: 1884select count(*) from fman_file where dateadded >= '10.10.2009'
費用: 1823
(2009 年 10 月 10 日は日付の例です!!!)
すべてのクエリの正確な時間値を念頭に置いているわけではありませんが、最初のクエリが実際に最速でした。
そこで、他のサブセレクト ((デュアルから 1000 を選択) など) を使用していくつかの選択クエリを試してみましたが、定数値を使用する他のクエリよりも (場合によっては WAY) 高速でした。この "WHATEVER" (バグ/機能) が MySQL でも発生しているようです。
では、最初のクエリが他のクエリよりも (方法で) 高速である理由を誰か教えてもらえますか?
グリーツ
PS: これは sydate に関するものではありません! 問題は、(選択した) バリエーションが他のバリエーションよりも速いのはなぜですか? (Select-Variation(1.) と Constant-Variation (4.) に少し焦点を当てます)