Дана некоторая таблица с первичным ключом, например:
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
FirstName nvarchar(50),
LastName nvarchar(50),
Address nvarchar(200),
Email nvarchar(260)
--...
)
у нас есть уникальный первичный ключ CustomerID.
Традиционно мне могут понадобиться некоторые дополнительные индексы покрытия; например, чтобы быстро найти пользователя с помощью CustomerIDили Email:
CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
CustomerID,
Email
)
И это те виды индексов, которые я создавал десятилетиями.
Не обязательно быть уникальным, но на самом деле это
Сам индекс существует, чтобы избежать сканирования таблицы; это вспомогательный индекс для повышения производительности (индекс не является ограничением для обеспечения уникальности).
Сегодня я вспомнил немного информации - SQL Server может использовать тот факт, что:
- столбец имеет ограничение внешнего ключа
- столбец имеет уникальный индекс
- ограничение является доверенным
чтобы помочь ему оптимизировать выполнение запроса. Фактически, из Руководства по проектированию индексов SQL Server :
Если данные уникальны и вы хотите обеспечить уникальность, создание уникального индекса вместо неуникального индекса для той же комбинации столбцов предоставляет дополнительную информацию для оптимизатора запросов, которая может создавать более эффективные планы выполнения . В этом случае рекомендуется создание уникального индекса (предпочтительно путем создания уникального ограничения).
Учитывая, что мой многостолбцовый индекс содержит первичный ключ, этот составной индекс будет де-факто уникальным. Это не ограничение, которое мне особенно нужно, чтобы SQL Server применял каждый раз при вставке или обновлении; но дело в том , что это не-кластерный индекс является уникальным.
Есть ли какое-либо преимущество в маркировке этого фактического уникального индекса как уникального?
СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС IX_Customers_CustomerIDEmail ON Клиенты ( Пользовательский ИД, Электронное письмо )
Мне кажется , что SQL Server может быть достаточно умны , чтобы понять , что мой индекс уже является уникальным в силу того , что он содержит первичный ключ.
- Но, возможно, он этого не знает, и для оптимизатора есть преимущество, если я все равно объявлю индекс уникальным.
- За исключением, возможно, это теперь может привести к замедлению во время вставок и обновлений, где он должен выполнять проверки уникальности - там, где раньше это никогда не было раньше.
- Если он не знает, что индекс гарантированно уже будет уникальным, потому что он содержит первичный ключ.
Я не могу найти никаких рекомендаций от Microsoft о том, что делать, если составной индекс содержит первичный ключ.
Преимущества уникальных индексов включают следующее:
- Целостность данных определенных столбцов обеспечивается.
- Предоставляется дополнительная информация, полезная для оптимизатора запросов.
Должен ли я пометить составной индекс как уникальный, если он уже содержит первичный ключ? Или SQL Server может выяснить это для себя?


