2012-03-16 180 views
2

在日期字段中,我有一個默認值,指示未完成任務。 當我查詢找到所有完成的任務,如果我的默認日期是12/31/9999,那麼這會更好嗎?SQL日期查詢:'不等於'比'小於'更昂貴

SELECT * FROM Table WHERE Completed <> '12/31/9999' 

OR

SELECT * FROM Table WHERE Completed < '12/31/9999' 

或者它完全取決於我的索引。

+2

如果沒有完成日期,它會不使用更多的語義意義使用NULL? – 2012-03-16 15:31:12

+2

這是第一次記錄的Y10K錯誤嗎? – 2012-03-16 15:35:16

回答

9

以下是WHERE子句中使用的關鍵運算符,按其性能排序。頂部的那些運營商將產生比底部列出的結果更快的結果。

= 
>, >=, <, <= 
LIKE 
<> 

http://www.sql-server-performance.com/2007/t-sql-where/

+1

在該列表上放置LIKE似乎有點武斷。它可以在頂部使用'='(如果沒有通配符)或底部(如果使用通配符) – 2012-03-16 15:44:24

+0

謝謝,這看起來應該是一個很好的通用規則。因爲我不是dba。 – Nate 2012-03-16 15:46:37

0

我沒有很好地理解你的問題,但這種比較完全取決於你的索引。

1

沒有太大的差別可能。

如果Completed使用索引來滿足查詢則<>將有兩個範圍尋求(< '12/31/9999'> '12/31/9999')而不僅僅是<尋求。

所以最好使用<避免不必要的額外>尋求不返回任何東西。

+0

謝謝,這有助於我理解查詢的查找方面。 – Nate 2012-03-16 15:45:58

0

你說:

在日期字段我有一個默認值,指示任務

它使該字段爲可以爲空和更有意義的一個未完成的默認值爲null。所以,這個領域缺乏日期意味着任務尚未完成。

您可以通過更改表格並將默認值設置爲空以及更新所有值爲'12/31/9999'的所有值爲空來輕鬆解決此問題。然後,你將運行的查詢將是:

SELECT * FROM Table WHERE Completed IS NOT NULL 
+0

就像在旁邊。我見過一些決定將日期存儲爲零而不是空的數據庫。儘量避免這種做法,因爲它可能會導致實際問題以後再查詢。只要將它們保留爲空即可。 – Rob 2012-09-05 14:09:22