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