Я знаю, коли мова йде про використання індексу або сканування таблиці, SQL Server використовує статистику, щоб побачити, який з них краще.
У мене є таблиця з 20 мільйонами рядків. У мене індекс на (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]
У таблиці немає ПК, оскільки це сховище даних.
CREATE NONCLUSTERED INDEX [nci_SnapshotKeyMeasure] ON [t1]
(
[SnapshotKey] ASC,
[Measure] ASC
)