BETWEEN子句与<= AND> =

wwe*_*ker 32 sql oracle performance oracle10g oracle11g

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

即这两个查询:

SELECT *  
  FROM table  
 WHERE year BETWEEN '2005' AND '2010';  
Run Code Online (Sandbox Code Playgroud)

...和

SELECT *  
  FROM table  
 WHERE year >= '2005' AND year <= '2010';
Run Code Online (Sandbox Code Playgroud)

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

Qua*_*noi 27

没有区别.

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

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


wwe*_*ker 17

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

恩.

SELECT *  
  FROM table
 WHERE column BETWEEN :lower_bound AND :upper_bound  
Run Code Online (Sandbox Code Playgroud)

......将自动变为:

SELECT *  
  FROM table
 WHERE :lower_bound <= column
   AND :upper_bound >= column
Run Code Online (Sandbox Code Playgroud)

  • @rsenna:不,我发布这个问题是为了存储这里的信息,因为我们办公室的人问我这个,我注意到在搜索时没有其他人曾经问过这里.这是我对当今世界的知识贡献,并且根据常见问题和使命声明有效地使用了该服务.我打算在10秒内询问,回答并接受我的回答,但系统不会让我这么快接受我自己的回答,所以其他人也开始回答... (11认同)
  • 我个人不同意徽章的存在,因为我所见过的只是人们试图游戏系统来获取它(在发布问题的几分钟内将已知答案发布到副本).更糟糕的是那些接受他们自己而不是正确回答他们的人的人.我永远不会通过投票来获得这些答案. (3认同)
  • 嘿,没问题。事实上SO官方[批准](http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions)这种行为...... (2认同)

Ben*_*oit 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
Run Code Online (Sandbox Code Playgroud)

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