优化:使用“between”或“>= and <=”

Optimization: Use “between” or “>= and <=”

让我们以下面的问题为例。使用有什么区别吗:

SELECT * FROM foo_table 
WHERE column BETWEEN n and m

SELECT * FROM foo_table 
WHER column>=n and column<=m?

看起来很简单,Oracle 的文档对此非常清楚:

[Between]表示“大于或等于低值且小于或等于高值。”

从语义的角度来看,它们是相同的。但是,SQL 是一种声明性语言。所以,您不会期望两个语义相同的语句具有相同的执行计划,对吧?

我的问题是:

Oracle的优化器将between转换为>=<=,从执行计划可以看出。例如,这是来自 11gR2:

explain plan for
select * from dual where dummy between 'W' and 'Y';

select * from table(dbms_xplan.display);

--------------------------------------------------------------------------       
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |       
--------------------------------------------------------------------------       
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |       
|*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |       
--------------------------------------------------------------------------       

Predicate Information (identified by operation id):                              
---------------------------------------------------                              

   1 - filter("DUMMY">='W' AND "DUMMY"<='Y')                                   

注意正在使用 filter。所以你使用哪个没有什么区别,除了像 the article this seems to have come from 这样的边缘情况(感谢 Shankar)。为主流案例担心它可能不会有太大好处。