2011-10-24 5 views
2

私はYEAR(日付)関数の効率はどれくらいですか?

YEAR(ACTIVITYDATE) = some integer 

私はACTIVITYDATEの上にインデックスを追加して、自分のフィルターにYEAR関数を適用することができますすべてのレコードの数百万レコードを持つテーブルを検索する必要があります。

ただし、列がYEAR(ACTIVITY)として定義されており、ACTIVITYYEAR以上のインデックスを保持する計算列ACTIVITYYEARを保存する方が良いとは思わないでしょうか?

テーブルのインデックス付きの列に十分な個別の値がないと、SQLはとにかくテーブルスキャンを行います。私はまだテストを実行するのに十分なデータを持っていません。私は可能な限りテーブルレイアウトを定義しようとしています。

あなたの考えは?

+0

代替手段はありますか?文字列操作ですか? – Jeremy

+0

私が従うかわからない。私は文字列としてのキャストがパフォーマンスを向上させるとは思わない。おそらく反対です。私の選択肢は、私が気づいていない別の選択肢がない限り、上記の2つのうちの1つです。 – ChadD

+0

あなたはビューを試してみませんか? – TheVillageIdiot

答えて

3

1年と一致する行について「テーブルを検索する」計算列を持つ必要はありません。代わりに区間を使用してwhere句を書き、日付列にインデックスを付けます。あなたは二つの文字列の代わりにクエリを引数としてint型(年)を使用したい場合は

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

あなたは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)  
+2

これもオプションです(これは私が提案したものです)。理由を比較するときに時間の部分を見なければならない理由はありませんでした。 –

+0

@MitchWheat - はい、時間は通常包括的であるため「間」を使用すると気になります。 –

+0

+1これのための別の列を持つポイントはありません。 –

1

という指標その後、ACTIVITYDATEに計算列を作成して:あなたは、いくつかの異なる日付を持っている場合は、あなたもそれは可能性が高く使います作るためにfiltered indexを作成することができ

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

1

計算された列を使用してインデックスを作成する方がパフォーマンスが優れています。

関連する問題