2011-01-07 62 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改寫爲> =和< =