3

是否可以在 和 等部件DateTime上设置索引?例如,我有以下 T-SQL 查询:DATEPART(YEAR, bp.[CreatedOn])DATEPART(MONTH, bp.[CreatedOn])

DECLARE @year AS INT = 2012;
DECLARE @month AS INT = 8;

SELECT bp.Title, bp.CreatedOn FROM BlogPosts bp
WHERE (DATEPART(YEAR, bp.[CreatedOn]) = @year) AND (DATEPART(MONTH, bp.[CreatedOn]) = @month)
ORDER BY bp.CreatedOn;

这是我的执行计划:https ://gist.github.com/3551450

目前,记录并不多,因此在性能方面不是一个大问题,但记录会随着时间的推移而增长。

4

3 回答 3

9

您最好使用 datetime 字段构建标准:

declare @startMonth datetime = '20120801'

SELECT bp.Title, bp.CreatedOn 
  FROM BlogPosts bp
 WHERE bp.[CreatedOn] >= @startMonth
   AND bp.[CreatedOn] < dateadd (month, 1, @startMonth)
ORDER BY bp.CreatedOn;

这样查询执行器将能够在 CreatedOn 上使用索引。

于 2012-08-31T11:07:31.670 回答
5

是的,是否可以将索引放在年份和月份上。这是一个例子:

create table testt(d datetime)
alter table testt add year as year(d) PERSISTED -- after marc_s advise. Thx
alter table testt add month as month(d) PERSISTED --

create index idx_year on testt(year)
create index idx_month on testt(month)

但是,我总是会使用 Nikola 解决方案的变体,所以 +1 给 Nikola。

这是您可以将月份和年份重写为日期的方法:

DECLARE @year AS INT = 2012;
DECLARE @month AS INT = 8;
DECLARE @from DATE = dateadd(month, (@year-1900)*12 + @month - 1, 0)
于 2012-08-31T11:37:12.143 回答
0

我建议您将日期部分存储在不同的字段中。显然,这是您的域中存在的要求,因为它需要成为您的模型的一部分。

您失去的是您必须为加载的每个模型构建日期时间,或者设置值,但这将是几个 CPU 周期。

于 2012-08-31T12:04:46.017 回答