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

日時フィールドを使用して基準を作成することをお勧めします。

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)

ただし、私は常にニコラのソリューションのバリエーションを使用するため、ニコラに+1します。

これは、月と年を日付に書き換える方法です。

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 に答える