YEAR(日期)功能的效率如何?

时间:2011-10-24 03:04:37

标签: tsql sql-server-2008

我需要搜索包含数百万条记录的表格,其中包含所有

的记录
YEAR(ACTIVITYDATE) = some integer

我可以在ACTIVITYDATE上添加索引,然后将YEAR函数应用于我的过滤器。

但是,如果将列定义为YEAR(ACTIVITY)并且具有ACTIVITYYEAR的索引并保持索引,那么存储计算列ACTIVITYYEAR并不会更好吗?

我知道如果表中的索引列没有足够的不同值,SQL无论如何都会进行表扫描。我还没有足够的数据来执行测试,我现在尽可能多地定义表格布局。

你的想法?

3 个答案:

答案 0 :(得分:3)

对于匹配一年的行,无需为“搜索表”计算列。使用间隔写你where子句,并在你的日期列上有一个索引。

select SomeColumn
from YourTable
where ActivityDate >= '20110101' and
      ActivityDate < '20120101'

如果要使用int(year)作为查询的参数而不是两个字符串,则可以使用dateadd。只需确保不对ActivityDate列应用任何函数/操作,因为SQL Server将无法使用索引。

declare @Year int = 2011

select SomeColumn
from YourTable
where ActivityDate >= dateadd(year, @Year-1900, 0) and
      ActivityDate < dateadd(year, @Year-1899, 0)      

答案 1 :(得分:1)

ACTIVITYDATE上创建计算列,然后将其编入索引:

create table aTest
(
   id int not null,
   activityDate datetime null, 
   computedYear as YEAR(activityDate)
)

create nonclustered index NC_TEST on aTest(computedYear)
GO

insert into aTest (id, activityDate) VALUES (1, '2011/010/18')
insert into aTest (id, activityDate) VALUES (2, '2011/010/06')
insert into aTest (id, activityDate) VALUES (3, '2011/010/23')

参考:Creating Indexes on Computed Columns

如果您的日期很少,那么您还可以创建一个filtered index,以便更有可能使用它。

答案 2 :(得分:1)

性能最好使用计算列然后将其编入索引。