web-dev-qa-db-ja.com

BETWEEN句と<= AND> =

BETWEEN句の使用と<= AND> =比較の使用の間にパフォーマンスの違いはありますか?

つまり、次の2つのクエリ:

SELECT *  
  FROM table  
 WHERE year BETWEEN '2005' AND '2010';  

...そして

SELECT *  
  FROM table  
 WHERE year >= '2005' AND year <= '2010';

この例では、年列はVARCHAR2(4)にインデックスが付いています。

32
wweicker

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
17
wweicker

違いはありません。

BETWEENは常に包含的であり、引数の順序に敏感であることに注意してください。

BETWEEN '2010' AND '2005'TRUEにはなりません。

27
Quassnoi

疑わしい場合(とにかくOracleの場合) explain plan を実行すると、オプティマイザーが何をしたいのかがわかります。これは、「...の間にパフォーマンスの違いがありますか」に関するほとんどの質問に当てはまります。もちろん、他にも多くのツールがありますが、説明計画は良い出発点です。

2
tbone

それはずは同じです。

適切なデータベースエンジンは、その式に対して同じプランを生成します。

1
FolksLord

このための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 にあります

1
Lukas Eder

BETWEENが標準の> =および<=の組み合わせとは異なる実行計画を持つことができるという奇妙なEdgeのケースがある可能性があるため、実行計画を確認した方がよいでしょう。

https://blog.pythian.com/Oracle-can-between-and-greater-than-or-equal-to-and-less-than-or-equal-to-differ/

明らかに注意者。しかし、実行計画は時間とともに変化する可能性があり、実際にそのようなことをテストする意欲がないため、BETWEENをまったく使用しません。

選択肢が少ない方が良い場合もあります。

0
luis.espinal

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%
0
要你命三千