使用BETWEEN子句或使用< = AND> =比较之间是否存在性能差异?
即。这两个问题:
SELECT *
FROM table
WHERE year BETWEEN '2005' AND '2010';
...和
SELECT *
FROM table
WHERE year >= '2005' AND year <= '2010';
在此示例中,year列是VARCHAR2(4),其上有索引。
答案 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所述
答案 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; =组合具有不同的执行计划。
有时选择越少越好。