我有一个永远不会更新且很少插入的表。我需要优化此表以便在日期列和nvachar(32)上快速查询。
我正在向表中添加索引,我不确定将日期列拆分为单独的列是否最佳性能,例如年,月,日的单独列或只保留日期列。
查询基本上位于nvarchar列和年份列,或者可能包括年,月和日。
我实际要做的是在姓氏列和日期列上运行SOUNDEX子句
e.g。类似的东西:
SELECT DISTINCT [Surname]
FROM [dbo].[sometable]
WHERE YEAR(Datecolumn) = 2011 AND SOUNDEX(Surname) = SOUNDEX('smith')
什么是最佳表现?
答案 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值存储在一个单独的列中