Уникальное ограничение против уникального индекса
Мне интересно узнать, какие методики предпочитают использовать разработчики для обеспечения уникальности в SQL Server: UNIQUE CONSTRAINT или UNIQUE INDEX. Учитывая, что есть небольшая разница в физической реализации каждого, как вы решаете, какой из них лучше?
Есть ли другие причины, кроме производительности, чтобы оценить лучшее решение?
Есть ли преимущества управления базой данных для одного или другого?
4 ответа
Эта статья MSDN, в которой сравниваются эти два варианта, относится к SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx
Для большинства целей нет никакой разницы - ограничение реализовано в виде индекса под прикрытием. И хотя есть возможность отключить ограничение, оно фактически не работает в SQL Server.
Это имеет значение, только если вы хотите настроить такие вещи, как FILLFACTOR и т. Д., Для чего вы хотите реализовать уникальное ограничение.
SQL Server 2008+ добавлен INCLUDE
обеспечить более эффективные показатели покрытия. Отфильтрованные индексы = уникальное ограничение для подмножества строк / игнорирование нескольких нулей и т. Д.
Они существенно не отличаются. Когда вы создаете уникальное ограничение, SQL Server автоматически создает уникальный индекс для вас.
С помощью синтаксиса для создания индекса вы можете лучше управлять определением уникального индекса для указания кластеризованного / некластеризованного, включенных столбцов, файловой группы, фильтрации индекса (SqlSvr2008) и т. Д.
Ограничение является предпочтительным в большинстве случаев, потому что оно выражает намерение уникальности: это ограничение. Индекс не передает это намерение.
Что касается управляемости, влияние минимально. Вы можете управлять индексом (rebuild, reorg), как если бы он был создан независимо от ограничения. Единственное отличие состоит в том, что ограничение зависит от индекса, поэтому для удаления индекса необходимо также удалить ограничение.
Мои два цента: я бы использовал ограничение, когда я хотел описать бизнес-логику, и индекс, когда я хотел повысить производительность. Тот факт, что они могут быть реализованы одинаково в СУБД, не означает, что различие между причинами определения этих объектов не является существенным.
Уникальное ограничение подразумевает только уникальность, и удаление ограничения удалит индекс, созданный механизмом. Индекс может быть изменен, чтобы удалить его уникальность, и у вас все еще есть свой индекс. Я думаю, что можно предположить, что большинство столбцов, на которые можно навязать уникальность, также послужило бы индексом по соображениям производительности; следовательно, я использую в основном уникальные индексы. Я использую уникальные ограничения только для столбцов, которые должны быть уникальными, но неэффективными для производительности (т.е. varchar(200), который должен быть уникальным); в таком случае я хочу четко указать, что это должна быть уникальная, но, вероятно, не очень хорошая идея для поиска, несмотря на базовый индекс.