Какая разница между созданием индекса 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.
Здесь - отличная статья и видео, объясняющее разницу между обоими подходами.