2012-06-15 71 views
2

每當您編寫查詢時需要過濾出一系列值的行 - 那麼我應該使用BETWEEN子句或<=>=使用BETWEEN子句

哪一個性能更好?

+5

他們在性能方面完全相同 - 如果有合適的索引存在,SQL Server將做在這兩種情況下距離掃描。 –

+0

[SQL:BETWEEN vs <= and > =]可能重複(http://stackoverflow.com/questions/1630239/sql-between-vs-and) – GarethD

回答

6

都沒有。他們創建完全相同的執行計劃。

我使用它們的時間不取決於性能,而取決於數據。


如果數據是離散值,然後我用BETWEEN ...

  • x BETWEEN 0 AND 9


但是,如果數據是連續的值,那麼,那不太好...

  • x BETWEEN 0.000 AND 9.999999999999999999


相反,我使用>= AND < ...

  • x >= 0 AND x < 10


然而有趣的是,>= AND <技術實際上適用於連續和離散數據類型。所以,一般來說,我很少使用BETWEEN

+0

謝謝Dems!清理概念 – Deepesh

4

此外,請勿使用BETWEEN進行日期/時間範圍查詢。

以下真實含義是什麼?

BETWEEN '20120201' AND '20120229' 

有些人認爲,這意味着給我把所有的數據從二月,包括所有的數據隨時在2月29日。以上翻譯爲:

BETWEEN '20120201 00:00:00.000' AND '20120229 00:00:00.000' 

因此,如果在午夜後的任何時間29日有數據,您的報告將不完整。

的人也儘量聰明,挑一天「結束」:

BETWEEN '00:00:00.000' AND '23:59:59.997' 

,如果數據類型爲datetime工作。如果是smalldatetime範圍的末尾會四捨五入,並且您可能包含第二天的數據。如果它是datetime2,那麼您實際上可能會錯過當天最後2毫秒內發生的一小部分數據。在大多數情況下,統計上不相關,但如果查詢錯誤,則查詢是錯誤的。

因此對於日期範圍查詢,我總是強烈建議使用開放式範圍,例如,到二月份報告WHERE條款會說「或2月1日之後,和3月1日之前」如下:

WHERE date_col >= '20120201' AND date_col < '20120301' 

BETWEEN可以作爲僅利用date類型預期,但我還是更喜歡查詢中的開放式範圍,因爲稍後有人可能會更改該基礎數據類型以允許其包含時間。

我的博客上有很多更多的細節在這裏:

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx

+0

謝謝! @Aaron +1 – Deepesh

+0

更不用說'20120229'是一個完美的日期,但是'20110229'和'20130229'不是。使用'> = AND <'表示在查看每月分組時,您甚至不需要使用該日期。 – MatBailie

+0

@Dems是的,我故意選擇了這個日期。應該外推更多的用途。 :-) –

相關問題