优化:使用"between"或"> =和<="

fra*_*a66 0 oracle optimization between

例如,让我们采取以下问题.使用之间有什么区别:

SELECT * FROM foo_table 
WHERE column BETWEEN n and m
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM foo_table 
WHER column>=n and column<=m?
Run Code Online (Sandbox Code Playgroud)

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

[Between]表示"大于或等于低值且小于或等于高值".

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

我的问题是:

  • 优化器可能会监视不同的代码路径是否等于或小于数字索引,对吧?
  • 什么是更好,更快的数字类型的方式?

Ale*_*ole 6

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')                                   
Run Code Online (Sandbox Code Playgroud)

注意filter正在使用.所以你使用它没有任何区别,除了可能在边缘情况下,例如这篇文章似乎来自(感谢Shankar).担心主流案件可能不会带来太多好处.