优化:使用“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)。为主流案例担心它可能不会有太大好处。
让我们以下面的问题为例。使用有什么区别吗:
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)。为主流案例担心它可能不会有太大好处。