Хранение двух индексов для одних и тех же данных - пустая трата дискового пространства и обработка, необходимая для обслуживания данных.
Однако я могу представить продукт, который зависит от наличия индекса с именем IX_PrimaryKey
. Е.Г.
string queryPattern = "select * from {0} as t with (index(IX_PrimaryKey))";
Вы можете утверждать, что сам кластеризованный индекс занимает гораздо меньше места, чем другие, так как лист является фактическими данными. С другой стороны, кластеризованный индекс может быть более подвержен расщеплению страниц, а некоторые индексы лучше не кластеризованы.
Собирая все это вместе, я могу определенно подумать о сценариях, в которых удаление дублирующих индексов было бы плохим:
- Код, подобный приведенному выше, который зависит от известного имени индекса.
- Код, который может изменить кластеризованный индекс на любой из некластеризованных индексов.
- Код, который использует наличие / отсутствие
IX_PrimaryKey
для определенной обработки таблицы.
Я не рассматриваю ни один из этих хороших дизайнов, но я точно могу представить, что кто-то делает это. (Вы опубликовали это в DailyWTF?)
В некоторых случаях имеет смысл иметь перекрывающиеся индексы, которые не идентичны:
create index IX_1 on table1 (ID)
create index IX_2 on table1 (ID, TYPE, ORDER_DATE, TOTAL_CHARGES)
Если вы ищите строго по ID, SQL может оптимизировать и использовать IX_1. Если вы выполняете запрос на основе ID, TYPE, ORDER_DATE
и суммируете TOTAL_CHARGES
, SQL может использовать IX_2
в качестве «покрывающего индекса», удовлетворяя все детали запроса из индекса, даже не касаясь таблицы. Обычно это то, что вы добавляете в процессе настройки производительности после всестороннего тестирования.
Глядя на ваш приведенный пример двух индексов для одного и того же поля, я не вижу подходящего варианта. Возможно, SQL может использовать IX_ID
в качестве «индекса покрытия» при проверке существования значения и обойти блокировку IX_PrimaryKey
?