Какая разница между созданием индекса UNIQUE как "индекса" или "ограничения" в SQL Server?

При создании индекса над столбцом, который будет UNIQUE (но не основным ключом таблицы), SQL Server разрешил мне выбрать несколько вариантов:

1) Я могу выбрать для него Ограничение или Индекс.
Я предполагаю, что это означает, что если я установлю его как ограничение, он не будет использовать его при запросе, только при написании. Тем не менее, единственный эффективный способ, с помощью которого SQL Server может обеспечить такое ограничение, заключается в создании индекса. Какая польза для этой опции?

2) Кроме того, если я устанавливаю его как "индекс", он позволяет мне указать, что он должен игнорировать дубликаты ключей. Это самое неприятное для меня...
Я снова думаю, что это означает противоположность ограничения. Вероятно, это означает "использовать его при запросе, но даже не проверяйте при написании".
Но почему я должен установить его как УНИКАЛЬНЫЙ?
Я предполагаю, что есть некоторые оптимизации, которые может выполнять SQL Server, но я хотел бы лучше понять это.

Кто-нибудь знает, что именно делает SQL Server с этими параметрами?
Какой вариант использования для установки индекса является уникальным, но игнорировать повторяющиеся ключи?

ПРИМЕЧАНИЕ. Это для SQL Server 2000


EDIT: В соответствии с тем, что вы сказали, однако... Если я создам Constraint, будет ли он использоваться для ускорения запросов, которые фильтруют с использованием полей в ограничении?

Спасибо!

Ответы

Ответ 1

Ограничение A UNIQUE является частью стандарта ISO/ANSI SQL, тогда как индексы - это не потому, что стандарт является агностическим. SQL Server, как и большинство СУБД SQL, будет использовать индекс для реализации ограничения UNIQUE.

Возможно, использование UNIQUE вместо индекса в SQL script немного более переносимо, но, как всегда, не следует исключать проприетарный синтаксис, если он предоставляет возможности для оптимизации и т.д.

Ответ 2

SQL Server создаст индекс для реализации ограничений UNIQUE. Вы можете увидеть ссылку на уникальный индекс, который используется для обеспечения уникальных ограничений в представлении sys.key_constraints (в 2005 году - извините, я не Не знаю эквивалент 2000 года). Но обе версии будут использовать индекс при запросе.

Разница в том, что если вы создаете индекс, у вас больше контроля над его построением. В частности, вы можете включить дополнительные столбцы, которые могут часто просматриваться вместе с ключом.

Оба параметра позволят вам "игнорировать повторяющиеся ключи" для существующих данных, но оба будут вызывать ошибку, если вы попытаетесь вставить новое значение, которое дублирует существующее.

Ответ 3

Нет никакой практической разницы между уникальным ограничением и уникальным индексом, отличным от того факта, что уникальное ограничение также указано как объект ограничения в базе данных.

Ответ 4

В соответствии с MSDN нет существенных различий между созданием уникального индекса через уникальное ограничение или явно созданием с использованием инструкции CREATE UNIQUE INDEX. В обоих случаях данные проверяются для уникальности таким же образом, а также оптимизатор запросов не обрабатывает их по-разному. В качестве хорошей практики используйте уникальное ограничение, если целью является целостность данных, другое разумное использование непосредственно CREATE UNIQUE INDEX.

Здесь - отличная статья и видео, объясняющее разницу между обоими подходами.