在日期字段中,我有一个默认值,指示未完成任务。 当我查询找到所有完成的任务,如果我的默认日期是12/31/9999,那么这会更好吗?SQL日期查询:'不等于'比'小于'更昂贵
SELECT * FROM Table WHERE Completed <> '12/31/9999'
OR
SELECT * FROM Table WHERE Completed < '12/31/9999'
或者它完全取决于我的索引。
在日期字段中,我有一个默认值,指示未完成任务。 当我查询找到所有完成的任务,如果我的默认日期是12/31/9999,那么这会更好吗?SQL日期查询:'不等于'比'小于'更昂贵
SELECT * FROM Table WHERE Completed <> '12/31/9999'
OR
SELECT * FROM Table WHERE Completed < '12/31/9999'
或者它完全取决于我的索引。
以下是WHERE子句中使用的关键运算符,按其性能排序。顶部的那些运营商将产生比底部列出的结果更快的结果。
=
>, >=, <, <=
LIKE
<>
在该列表上放置LIKE似乎有点武断。它可以在顶部使用'='(如果没有通配符)或底部(如果使用通配符) – 2012-03-16 15:44:24
谢谢,这看起来应该是一个很好的通用规则。因为我不是dba。 – Nate 2012-03-16 15:46:37
我没有很好地理解你的问题,但这种比较完全取决于你的索引。
没有太大的差别可能。
如果Completed
使用索引来满足查询则<>
将有两个范围寻求(< '12/31/9999'
和> '12/31/9999'
)而不仅仅是<
寻求。
所以最好使用<
避免不必要的额外>
寻求不返回任何东西。
谢谢,这有助于我理解查询的查找方面。 – Nate 2012-03-16 15:45:58
你说:
在日期字段我有一个默认值,指示任务
它使该字段为可以为空和更有意义的一个未完成的默认值为null。所以,这个领域缺乏日期意味着任务尚未完成。
您可以通过更改表格并将默认值设置为空以及更新所有值为'12/31/9999'的所有值为空来轻松解决此问题。然后,你将运行的查询将是:
SELECT * FROM Table WHERE Completed IS NOT NULL
就像在旁边。我见过一些决定将日期存储为零而不是空的数据库。尽量避免这种做法,因为它可能会导致实际问题以后再查询。只要将它们保留为空即可。 – Rob 2012-09-05 14:09:22
如果没有完成日期,它会不使用更多的语义意义使用NULL? – 2012-03-16 15:31:12
这是第一次记录的Y10K错误吗? – 2012-03-16 15:35:16