Стратегия 1, укажите индексы, которые можно использовать для фильтрации. Таблица поиска будет извлекать оставшиеся данные. Это почти вдвое увеличивает использование пространства, и стоимость ввода-вывода при записи увеличивается в четыре раза.
on EventTable(EventDate)
on EventTable(EventTypeCode)
on EventTable(EventStatusCode)
Стратегия 2, предоставить закрывающие индексы, которые можно использовать для фильтрации. Там не будет никаких поисков.
Это в четыре раза увеличивает использование пространства и записывает стоимость ввода-вывода.
on EventTable(EventDate, EventId,
EventTypeCode, EventStatusCode)
on EventTable(EventTypeCode, EventId,
EventDate, EventStatusCode)
on EventTable(EventStatusCode, EventId,
EventDate, EventTypeCode)
Причина, по которой порядок столбцов имеет значение в индексе покрытия (в общем), заключается в том, что данные упорядочены по каждому столбцу по очереди. То есть: столбцы 2 тай-брейков столбец 1. столбец 3 тай-брейков столбцы 1 и 2.
Поскольку у вас нет запросов, которые фильтруют по нескольким столбцам, в вашем случае не имеет значения (в вашем случае) порядок столбцов после первого столбца.
Если у вас был запрос, например
where EventDate = @EventDate
and EventTypeCode = @EventTypeCode
Тогда этот индекс покрытия будет полезен. EventDate, вероятно, более избирателен, чем EventTypeCode, поэтому он идет первым.
on EventTable(EventDate, EventTypeCode,
EventId, EventStatusCode)
Редактировать дальше:
Если у вас есть запрос, такой как
where EventDate between '2008-12-01' and '2008-12-31'
and EventTypeCode = 'todo'
Тогда этот индекс будет работать лучше:
on EventTable(EventTypeCode, EventDate,
EventId, EventStatusCode)
Это объединит все события 'todo', упорядоченные по их EventDate в качестве тай-брейка. SQL Server просто должен найти первый элемент и прочитать его, пока не найдет элемент, который не соответствует критериям, и не остановится.
Если бы EventDate был первым в индексе, то данные были бы упорядочены по дате, а затем в каждой дате были бы сгруппированы вместе события 'todo'. SQL Server найдет первое задание 12-01, прочитает, пока не найдет элемент, который не соответствует критериям ... затем найдет первое задание 12-02, прочитает, пока не выйдет из задания ... затем найдет. .. в течение 31 дня.
Вы хотите выбрать индекс, который помещает элементы, которые вы хотите, смежные друг с другом.
При 300 записях в день ваша таблица получит до 5 миллионов записей за 50 лет. Это не так уж и много. Любая стратегия будет работать. Стратегия 1, вероятно, будет достаточно быстрой (ошибка на стороне пространства).