BETWEEN运算符与>=和<=运算符相比,是否有性能差异?

17

这两个语句在逻辑上是等价的:

SELECT * FROM table WHERE someColumn BETWEEN 1 AND 100

SELECT * FROM table WHERE someColumn >= 1 AND someColumn <= 100

一个与另一个相比,是否存在潜在的性能优势?


1
我甚至不知道有一个between运算符。第一次看到它时,我并不完全清楚between是包含还是排除的。我猜对了,但由于答案说没有性能差异,我会坚持使用第二个版本以使其更清晰。然而,我是那种会在不需要的地方添加括号,只是为了确保别人阅读我的代码时没有任何误解的人。 - drs9222
这个回答解决了你的问题吗?SQL:BETWEEN vs <=和>= - J Eti
5个回答

7

没有实际的好处,只是一种语法糖。

使用BETWEEN版本,在某些情况下可以避免函数重新计算。


2
没有性能优势,它只是一个小甜点。
如果您要检查查询比较,类似于:
DECLARE @Table TABLE(
        ID INT
)

SELECT  *
FROM    @Table
WHERE   ID >= 1 AND ID <= 100

SELECT  *
FROM    @Table 
WHERE   ID BETWEEN 1 AND 100

当你检查执行计划时,你应该注意到它完全相同


2

哦,这里有一个令人惊讶的结果。我这里没有SQL Server,所以我在Postgres中尝试了一下。显然,免责声明适用:这不一定会产生相同的结果,您的情况可能会有所不同,请在使用之前咨询医生。但是...

我只是用两种不同的方式编写了一个简单的查询:

select *
from foo
where (select code from bar where bar.barid=foo.barid) between 'A' and 'B'

并且

select *
from foo
where (select code from bar where bar.barid=foo.barid)>='A'
and (select code from bar where bar.barid=foo.barid)<='B'

令我惊讶的是,两者的运行时间几乎完全相同。当我进行 EXPLAIN PLAN 时,它们给出了相同的结果。具体来说,第一个查询对 bar 进行了两次查找,一次是 >= 测试,另一次是 <= 测试,就像第二个查询一样。

结论:在 Postgres 中,BETWEEN 确实只是语法糖。

个人而言,我经常使用它,因为它对读者更清晰,特别是如果被测试的值是表达式。弄清楚两个复杂表达式是相同的可能是一个非常棘手的练习。即使它们不相同,弄清楚两个复杂表达式应该是相同的甚至更加困难。


2

第一种写法没有性能上的优势,只是更容易阅读和编写。


0

哦,但你们都是在讨论搜索值在where子句左侧的情况。

有人看过当它在子句的另一侧时的差异吗?

SELECT * FROM table WHERE @date BETWEEN someCol1 AND someCol2

SELECT * FROM table WHERE someCol1 >= @date AND someCol2 <= @date


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接