BETWEEN句の使用と<= AND> =比較の使用の間にパフォーマンスの違いはありますか?
つまり、次の2つのクエリ:
SELECT *
FROM table
WHERE year BETWEEN '2005' AND '2010';
...そして
SELECT *
FROM table
WHERE year >= '2005' AND year <= '2010';
この例では、年列はVARCHAR2(4)にインデックスが付いています。
BETWEEN
は単純な表現方法であるため、2つのクエリ例の間にパフォーマンスの違いはありません。 包括的 範囲比較。 OracleがBETWEEN
条件を解析すると、自動的に個別の比較句に展開されます。
例.
SELECT *
FROM table
WHERE column BETWEEN :lower_bound AND :upper_bound
...自動的になります:
SELECT *
FROM table
WHERE :lower_bound <= column
AND :upper_bound >= column
違いはありません。
BETWEEN
は常に包含的であり、引数の順序に敏感であることに注意してください。
BETWEEN '2010' AND '2005'
はTRUE
にはなりません。
疑わしい場合(とにかくOracleの場合) explain plan を実行すると、オプティマイザーが何をしたいのかがわかります。これは、「...の間にパフォーマンスの違いがありますか」に関するほとんどの質問に当てはまります。もちろん、他にも多くのツールがありますが、説明計画は良い出発点です。
それはずは同じです。
適切なデータベースエンジンは、その式に対して同じプランを生成します。
このためのSQL標準を検討する価値があるかもしれません(ただし、これはshouldであっても、すべての実装に対応する[not])。
Format
<between predicate> ::=
<row value constructor> [ NOT ] BETWEEN
<row value constructor> AND <row value constructor>
Syntax Rules
[...]
6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z".
そうは言っても、動作に違いはありませんが、複雑なX
の場合、 Benoit here で述べたように、解析時間に違いがあるかもしれません
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt にあります
BETWEEN
が標準の> =および<=の組み合わせとは異なる実行計画を持つことができるという奇妙なEdgeのケースがある可能性があるため、実行計画を確認した方がよいでしょう。
明らかに注意者。しかし、実行計画は時間とともに変化する可能性があり、実際にそのようなことをテストする意欲がないため、BETWEENをまったく使用しません。
選択肢が少ない方が良い場合もあります。
run1 "X> = Y AND X <= Z"
run2 "X BETWEEN Y AND Z"
Explain Planを2回実行すると、1つのPlan hash value
を取得します。しかし、TomのrunStats pkgの結果は異なります。
Run1 ran in 1 cpu hsecs
Run2 ran in 1 cpu hsecs
run 1 ran in 100% of the time
Name Run1 Run2 Diff
STAT...recursive calls 12 13 1
STAT...CPU used by this sessio 2 3 1
STAT...physical read total IO 0 1 1
STAT...consistent gets 18 19 1
...
...
LATCH.row cache objects 44,375 1,121 -43,254
LATCH.cache buffers chains 68,814 1,397 -67,417
STAT...logical read bytes from 655,360 573,440 -81,920
STAT...session uga memory max 123,512 0 -123,512
STAT...session pga memory 262,144 65,536 -196,608
STAT...session pga memory max 262,144 65,536 -196,608
STAT...session uga memory -327,440 65,488 392,928
Run1 latches total versus runs -- difference and pct
Run1 Run2 Diff Pct
203,927 28,673 -175,254 711.22%