Уникальное ограничение против уникального индекса - PullRequest
43 голосов
/ 21 июля 2010

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

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

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

Ответы [ 4 ]

31 голосов
/ 21 июля 2010

Эта статья по MSDN, в которой сравниваются два варианта, относится к SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

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

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

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

30 голосов
/ 21 июля 2010

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

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

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

2 голосов
/ 27 октября 2016

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

1 голос
/ 15 сентября 2015

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

...