次の構造のテーブルがあります。
create table MyTable (
ID int identity,
Whatever varchar(100),
MyTime time(2) not null,
MyDate date not null,
MyDateTime AS (DATEADD(DAY, DATEDIFF(DAY, '19000101', [MyDate]),
CAST([MyDate] AS DATETIME2(2))))
)
計算列は、日付と時刻を 1 つの datetime2 フィールドに追加します。テーブルに対するほとんどのクエリには、次の句が 1 つ以上含まれています。
... WHERE MyDate < @filter1 and MyDate > @filter2
... ORDER BY MyDate, MyTime
... ORDER BY MyDateTime
簡単に言えば、通常、日付はフィルタリングに使用され、完全な日時はソートに使用されます。質問は次のとおりです。
- これらの3つの日時列にインデックスを設定する最良の方法は? 日付と時刻で2つ、または日付で1つ、複合日時で1つ、または何か他のものですか? このテーブルでは非常に多くの挿入と更新が行われるため、過剰なインデックス作成は避けたいと考えています。
- この質問を書いているときに、長くてちょっと醜い計算列の定義に気づきました。少し前にどこかから拾いましたが、もっと簡単な方法があるかどうかを調べるのを忘れていました。date と time2 を datetime2 に結合する簡単な方法はありますか? 単純な追加は機能しません。また、varchar へのキャスト、結合、キャストバックを避けるべきかどうかわかりません。