日期列上的SQL查询优化

时间:2013-03-01 12:16:45

标签: sql query-optimization

我有一个永远不会更新且很少插入的表。我需要优化此表以便在日期列和nvachar(32)上快速查询。

我正在向表中添加索引,我不确定将日期列拆分为单独的列是否最佳性能,例如年,月,日的单独列或只保留日期列。

查询基本上位于nvarchar列和年份列,或者可能包括年,月和日。

我实际要做的是在姓氏列和日期列上运行SOUNDEX子句

e.g。类似的东西:

SELECT DISTINCT [Surname]
FROM [dbo].[sometable]
WHERE YEAR(Datecolumn) = 2011 AND SOUNDEX(Surname) = SOUNDEX('smith')

什么是最佳表现?

2 个答案:

答案 0 :(得分:2)

如果这是你要做过滤器的方式,那么索引就没用了,因为你将函数应用于那些列。对于你可以做的DateColumn

DateColumn >= '20110101' AND DateColumn < 20120101

如果真的有必要,您还可以使用年份和月份创建计算列,并在这些列上创建索引。对于Surname列,我认为没有太多事情可做,SOUNDEX搜索速度很慢,并且不会像使用它那样使用索引。您仍然可以考虑创建一个持久计算列,并将SOUNDEX函数的结果应用于Surname,在该列上创建索引并使用计算列执行过滤。这可以加快您的查询速度。

答案 1 :(得分:0)

对于datetime列,您可以将where子句用作:

WHERE DateColumn BETWEEN '01/01/2011'  AND '01/01/2012'

但是如果你要对where子句中的列进行任何操作,那么索引就没用了。我能提供的是将Surname的预先计算的SOUNDEX值存储在一个单独的列中