2011-01-07 65 views
1

专家一个具有列数的数据类型我有表,该表含有列st_date与数据类型和数目的值包含日期会是这样20101201即(01-DEC-2010)的Oracle SQL使用BETWEEN

,如果我写的界限之间撒谎日期间条使用select查询,我的问题是,是否比运营商或小于或大于之间使用,这是性能的高效。

select id, sum(duration), sum(hit_count) 
from A 
where st_date between 20101101 AND 20101130 
group by id 

该表拥有数百万条记录,由st_date.Is分隔,高于或低于1。

select id, sum(duration), sum(hit_count) 
from A 
where st_date >= 20101101 AND st_date < 20101130 
group by id 

请让我知道您的答案。

回答

5

第二个是更高性能的。你可以在执行计划的谓词信息部分看到它。

explain plan for select * from t1 where n between 100 and 200; 

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

    1 - filter("N">=100 AND "N"<=200) 

另外,虽然我们是在它:

不要存储日期数字。

甲骨文知道date '2010-12-31' and date '2011-01-01'之间的差额为1天。 Oracle也知道201和20110101之间的差异是8870.

想想那对基数估计有什么影响。

4

BETWEEN是包容性的。这意味着>=低于和<=上。

所以你的例子不完全相同。假设你修复了,那么他们将生成相同的查询计划。

BETWEEN的使用更清楚些。

+0

是的,我会修复上限。谢谢 – 2011-01-07 08:32:26

1

米奇小麦在他answer指出,在已经固定你的第二个查询的3号线为

where st_date >= 20101101 AND st_date <= 20101130 

那么你的两个查询会产生同样的结果。 完成时间也不会有任何差异。

我个人使用BETWEEN每当我需要定义时间/日期间隔。因为它选择较少的数据:)

在内部,between改写为> =和< =