41

Мне интересно узнать, какие разработчики техники предпочитают использовать для обеспечения уникальности в SQL Server: УНИКАЛЬНЫЙ КОНСТРАКЦИЯ или УНИКАЛЬНЫЙ ИНДЕКС. Учитывая, что в физической реализации каждого из них мало различий, как вы решаете, что лучше?Уникальный Constraint vs Unique Index

Есть ли причины, отличные от производительности, для оценки наилучшего решения?

Есть ли преимущества управления базой данных для одного или другого?

ответ

30

В этой статье MSDN сравнение двух для SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

В большинстве случаев, нет никакой разницы - это ограничение реализуется как индекс под одеялом. И хотя есть возможность отключить ограничение, на самом деле он не работает в SQL Server.

Это имеет значение, если вы хотите настроить такие вещи, как FILLFACTOR и т. Д., Для чего вы хотите реализовать уникальное ограничение.

SQL Server 2008+ добавил INCLUDE для обеспечения более эффективных индексов покрытия. Отфильтрованные индексы = уникальное ограничение над подмножеством строк/игнорирование множественного нуля и т. Д.

+2

. Статья хорошая. Интересно, что он заключает, что «нет никакой практической разницы», кроме метаданных. – bobs

+0

tut, tut, цитирующий MSDN для SQL Server 2000 – gbn

+2

@gbn: Правда, но что-то изменилось? –

26

Это not significantly different. Когда вы создаете уникальное ограничение, SQL Server автоматически создаст для вас уникальный индекс.

С синтаксисом для создания индекса, вы можете иметь более эффективный контроль, определяющие уникальный индекс, чтобы указать кластерные/некластеризованные, включенные столбцы, группы файлов, индекс фильтрацию (SqlSvr2008) и т.д.

Ограничение является предпочтительным в большинстве потому что он выражает намерение уникальности: это ограничение. Индекс не передает этого намерения.

Что касается управляемости, воздействие минимально. Вы можете управлять индексом (rebuild, reorg), как если бы он был создан независимо от ограничения. Единственное различие заключается в том, что ограничение зависит от индекса, поэтому, чтобы отбросить индекс, вы также должны отказаться от ограничения.

+1

+1 Я бы также сказал, что последовательность, а также вы часто в конечном итоге меняете ограничение на индекс в любом случае, чтобы добавить INCLUDE – gbn

1

Уникальное ограничение подразумевает уникальность, и удаление ограничения приведет к удалению индекса, созданного движком. Индекс может быть изменен, чтобы удалить его уникальность, и у вас все еще есть ваш индекс. Я думаю, можно предположить, что большинство столбцов, которые могли бы использовать уникальность, также послужили бы хорошим индексом для повышения производительности; ergo, я использую уникальные индексы в основном. Я использую уникальные ограничения только для столбцов, которые должны быть уникальными, но плохо работают для производительности (т. Е. Varchar (200), которые должны быть уникальными); в таком случае я хочу четко указать, что он должен быть уникальным, но, вероятно, не такой хорошей идеей для поиска, несмотря на базовый индекс.

2

Мои два цента: я бы использовал ограничение, когда хотел описать бизнес-логику и индекс, когда хотел повысить производительность. Тот факт, что они могут быть реализованы одинаково в СУБД, не означает, что различие между причинами для определения этих объектов не имеет значения.

Смежные вопросы