2012-03-16 183 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