ここにテーブルがあります:
CREATE TABLE Meetings
(
ID int PRIMRY KEY IDENTITY(1,1)
StartDate DateTime NOT NULL,
EndDate DateTime NULL,
Field1 varchar(50),
Field2 varchar(50),
Field3 varchar(50),
Field4 varchar(50)
)
数千行あります。データ範囲は、さまざまなサイズ (数日から 50 年まで) にすることができます。
クエリは次のとおりです。
DECLARE @ApplicableDate DateTime
SELECT ID, StartDate, EndDate, Field1, Field2, Field3, Field4
FROM Meetings
WHERE StartDate <= @ApplicableDate AND
(EndDate is null || @ApplicableDate <= EndDate)
日付範囲が大きくなる可能性があるため、テーブルの大部分 (行の 20% ~ 50%) が返される可能性があります。
クエリは必要な行を単純な方法で表していますが、パフォーマンスはかなり悪いです。追加するインデックスに関係なく、クラスター化されたインデックス スキャンを実行します。私はもう試した:
- 開始日
- 開始日、終了日
このクエリのパフォーマンスを改善するにはどうすればよいですか?
この質問とこの質問の回答も確認しました。これらのソリューションは私の状況では役に立ちません - 日付の別のテーブルを作成してクエリを等価クエリに変えることで、ビジネスのデータをいじりたくありません (終了日が変更された場合、または null の場合はどうなりますか? )、またはデータをモーフィングして空間インデックスに適合させます。
それでも、私はデータ構造の変更の可能性を受け入れています (特に、行を追加せず、奇妙なデータ型を使用しない場合)。