Уникальный Constraint vs Unique Index - программирование

Уникальный Constraint vs Unique Index

Мне интересно узнать, какие технологии разработчики предпочитают использовать для обеспечения уникальности в SQL Server: UNIQUE CONSTRAINT или UNIQUE INDEX. Учитывая, что в физической реализации каждого из них мало различий, как вы решаете, что лучше?

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

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

4b9b3361

Ответ 1

Эта статья MSDN, сравнивающая эти две версии, предназначена для SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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