我需要搜索包含数百万条记录的表格,其中包含所有
的记录YEAR(ACTIVITYDATE) = some integer
我可以在ACTIVITYDATE上添加索引,然后将YEAR函数应用于我的过滤器。
但是,如果将列定义为YEAR(ACTIVITY)并且具有ACTIVITYYEAR的索引并保持索引,那么存储计算列ACTIVITYYEAR并不会更好吗?
我知道如果表中的索引列没有足够的不同值,SQL无论如何都会进行表扫描。我还没有足够的数据来执行测试,我现在尽可能多地定义表格布局。
你的想法?
答案 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)
性能最好使用计算列然后将其编入索引。