При просмотре фактического плана выполнения он показывает отсутствующие индексы, даже если запрос занимает менее 1 секунды.
SELECT
Account.AccountID,
Account.Name
FROM
account
LEFT OUTER JOIN accountfeaturesetting afs
ON afs.accountid = account.accountid
and afs.featureid = 'Schedules'
and
afs.settingid = 'EditReasons'
WHERE
ISNULL(afs.Value, '0') = '0'
AND EXISTS
(SELECT 1 FROM program WHERE program.AccountID = account.AccountID
AND program.Active = 1
AND (program.ScheduleEditReasonFlags <> 0
OR program.ScheduleEditReasonFields <> 0))
AND account.IsMaster = 0
AND account.BeginDate IS NOT NULL
План выполнения показывает:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Account] ([IsMaster],[BeginDate])
INCLUDE ([AccountID],[Name])
Нужно ли создавать индекс, даже если запрос занимает всего 1 секунду? На каком основании должен быть создан индекс?
Я собираюсь выполнить этот запрос как ежедневную работу.
Ответы:
Вам не нужно добавлять индекс прямо сейчас. Все сообщения об отсутствующем индексе означают, что это может быть полезно. Это может быть не честно, или может быть индекс, который помогает еще больше.
Что касается того, когда вам нужно добавить новый индекс? Хорошо, скажем, у вас есть 100 строк в таблице счетов, но она еще не используется. Через пару месяцев у вас будет до 10000 строк, и теперь запрос занимает полчаса или больше. В этот момент вы можете рассмотреть возможность добавления индекса. И когда я говорю «подумай», я имею в виду проверить его в тестовой среде и посмотреть, действительно ли он улучшит ситуацию.
Другие соображения включают в себя:
источник