6

数百万のエントリを持つ SQL テーブルがあり、60 日より古いエントリの数をクエリしようとしました (Oracle 11.2.0.1.0)。

この実験では、選択ステートメントの 3 つの異なるバージョンを使用しました:
(コスト値は、Oracle V. 9.7.2.5 の TOAD によって与えられます)

  1. select count(*) from fman_file
    where dateadded >= (select sysdate - 60 from dual)

    コスト: 65

  2. select count(*) from fman_file
    where dateadded >= sysdate - 60

    コスト: 1909

  3. select count(*) from fman_file
    where dateadded >= sysdate - numtodsinterval(60,'day')

    コスト: 1884

  4. select 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.) に少し焦点を当てます)

4

5 に答える 5

3

第6章「驚くべきsysdate」のJonathanLewisによる「Cost-BasedOracleFundamentals」の私のコピーでいくつかのヒントを見つけました。これは9i、おそらくそれ以降のバージョンにも当てはまるようです。

オプティマイザーは、sysdate(およびtrunc(sysdate)およびsysdateの他のいくつかの関数)を解析時に既知の定数として扱いますが、sysdate + Nは不明になり、バインド変数と同じ扱いを受けます。つまり、5%の選択性が固定されます。 。(特に、sysdate + 0は、sysdateとは異なるカーディナリティを与えることに注意してください。)

どうやらオプティマイザーselect sysdate from dualは既知の定数としても認識します。

于 2010-07-07T15:33:43.703 に答える
1

トム・カイト

デュアルの利点は、オプティマイザがデュアルが特殊な 1 行 1 列のテーブルであることを理解していることです。クエリで使用すると、プランを作成するときにこの知識が使用されます。

于 2010-07-07T14:41:06.673 に答える
0

> =の後に計算の前後に()を付けて2〜4の数値を再試行しましたか?最初のステートメントがその値を一度計算する唯一のステートメントであるように見えます-他のすべてのステートメントについては、すべての行で再計算します。例えば:

select count(*) from fman_file where dateadded >= (SELECT sysdate - 60) 

select count(*) from fman_file where dateadded >= (SELECT (sysdate - numtodsinterval(60,'day'))

select count(*) from fman_file where dateadded >= (SELECT CONVERT(datetime,'10.10.2009')) 

注意-Oracleで日時に変換する構文がわからない-しかし、あなたはその考えを理解している。

于 2010-07-07T14:36:11.033 に答える
0

(select sysdate - 60 from dual)を使用する代わりに、クエリが実行される前に値が計算されるバインド変数を使用することをお勧めします

于 2014-02-14T06:47:39.773 に答える
0

を使用してみてくださいExplain Plan。これにより、クエリの実行内容とそれらの違いが表示されます。

説明計画をセットアップして使用するためのいくつかのリンク:

http://download.oracle.com/docs/cd/B10500_01/server.920/a96533/ex_plan.htm

http://www.adp-gmbh.ch/ora/explainplan.html

于 2010-07-07T14:48:03.820 に答える