インデックスまたはテーブルスキャンを使用する場合、SQL Serverは統計を使用してどちらが優れているかを確認します。
2,000万行のテーブルがあります。(SnapshotKey、Measure)のインデックスと次のクエリがあります。
select Measure, SnapshotKey, MeasureBand
from t1
where Measure = 'FinanceFICOScore'
group by Measure, SnapshotKey, MeasureBand
クエリは500k行を返します。したがって、クエリはテーブルの行の2.5%のみを選択します。
問題は、SQL Serverが私が持っている非クラスター化インデックスを使用せず、代わりにテーブルスキャンを使用する理由です。
統計を更新しました。
ただし、クエリのパフォーマンスは良好です。
テーブルスキャン
強制インデックス
テーブル/インデックス構造
CREATE TABLE [t1](
[SnapshotKey] [int] NOT NULL,
[SnapshotDt] [date] NOT NULL,
[Measure] [nvarchar](30) NOT NULL,
[MeasureBand] [nvarchar](30) NOT NULL,
-- and many more fields
) ON [PRIMARY]
データウェアハウスであるため、テーブルにPKはありません。
CREATE NONCLUSTERED INDEX [nci_SnapshotKeyMeasure] ON [t1]
(
[SnapshotKey] ASC,
[Measure] ASC
)