В чем разница между созданием уникального индекса как «индекса» или «ограничения» в SQL Server? - PullRequest
13 голосов
/ 21 октября 2008

При создании индекса по столбцу, который будет УНИКАЛЬНЫМ (но не первичным ключом таблицы), сервер SQL позволяет мне выбрать несколько вариантов:

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

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

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

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

. <ч />

РЕДАКТИРОВАТЬ: В соответствии с тем, что вы сказали, однако ... Если я создам ограничение, будет ли оно использоваться для ускорения запросов, которые фильтруют, используя поля в ограничении?

Спасибо!

Ответы [ 4 ]

8 голосов
/ 21 октября 2008
Ограничение

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

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

5 голосов
/ 21 октября 2008

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

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

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

2 голосов
/ 14 сентября 2012

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

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

2 голосов
/ 21 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...