인덱스 또는 테이블 스캔을 사용할 때 SQL Server는 통계를 사용하여 어느 것이 더 나은지 알 수 있습니다.
2 천만 개의 행이있는 테이블이 있습니다. (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
)