BETWEEN子句与< = AND> =

时间:2011-01-26 19:32:47

标签: sql performance oracle oracle10g oracle11g

使用BETWEEN子句或使用< = AND> =比较之间是否存在性能差异?

即。这两个问题:

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

...和

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

在此示例中,year列是VARCHAR2(4),其上有索引。

8 个答案:

答案 0 :(得分:27)

没有区别。

请注意BETWEEN始终具有包容性,并且对参数的顺序很敏感。

BETWEEN '2010' AND '2005'永远不会是TRUE

答案 1 :(得分:17)

两个示例查询之间没有性能差异,因为BETWEEN只是表达包含范围比较的简写方式。当Oracle解析BETWEEN条件时,它将自动扩展为单独的比较子句:

离。

SELECT *  
  FROM table
 WHERE column BETWEEN :lower_bound AND :upper_bound  

...将自动变为:

SELECT *  
  FROM table
 WHERE :lower_bound <= column
   AND :upper_bound >= column

答案 2 :(得分:6)

实际上它取决于您的DBMS引擎。

某些数据库管理系统会计算两次表达式(每次比较一次),使用BETWEEN时只计算一次。

实际上,如果表达式具有非确定性结果BETWEEN将具有不同的行为,请在SQLite中比较以下内容:

WHERE RANDOM() BETWEEN x AND y -- one random value generated

WHERE RANDOM() >= x AND RANDOM() <= y -- two distinct random values generated

如果您的表达式是(例如)子查询,那么这可能非常耗时。

答案 3 :(得分:2)

如果有疑问(无论如何),运行explain plan,您将看到优化程序想要执行的操作。这适用于大多数关于“......之间是否存在性能差异”的问题。当然还有很多其他工具,但解释计划是一个良好的开端。

答案 4 :(得分:1)

应该是相同的。

良好的数据库引擎将为该表达式生成相同的计划。

答案 5 :(得分:1)

为此可能值得考虑SQL标准(尽管可能对应于所有实现,即使它应该):

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

中找到

答案 6 :(得分:0)

run1“X&gt; = Y和X&lt; = Z”

run2“X BETWEEN Y和Z”

当我两次运行解释计划时,我得到一个Plan hash value。 但汤姆的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%

答案 7 :(得分:0)

您最好检查执行计划,因为可能存在一些奇怪的边缘情况,其中BETWEEN可以与标准&gt; =和&lt; =组合具有不同的执行计划。

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

显然需要注意。但是由于执行计划会随着时间的推移而发生变化,而我真的没有兴趣去测试这些事情,所以我宁愿不使用BETWEEN。

有时选择越少越好。

相关问题