2012-04-21 5 views
42

У меня есть таблица с именем countries, и я определяю столбец country_name, чтобы быть уникальным, создав «Index/Key» типа «Unique Key» на SQL Server 2008 R2.Уникальный ключ против уникального индекса на SQL Server 2008

Но у меня есть следующие вопросы:

  1. будет создание «Индекс/Key» типа «Уникальный ключ» автоматически создать некластеризованный индекс по этой колонке?
  2. если я изменяю тип от «Уникального ключа» до «Индекса», и я сохраняю значение IsUnique «Да», тогда будут ли какие-либо различия?
  3. так почему есть два варианта: «Уникальный ключ» и «Индекс». Я думаю, что два одинаковы?

ответ

59

Уникальное ограничение реализовано за кулисами как уникальный индекс, поэтому на самом деле не имеет значения, как вы его определяете. Я стараюсь реализовать его просто как:

ALTER TABLE dbo.foo ADD CONSTRAINT UQ_bar UNIQUE(bar); 

Некоторые люди создают уникальный индекс, например,

CREATE UNIQUE INDEX IX_UQ_Bar ON dbo.foo(bar); 

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

Я думаю, что есть несколько вариантов придерживаться как предыдущей функциональности Sybase, так и придерживаться стандарта ANSI (хотя уникальные ограничения не соответствуют стандартным 100%, поскольку они допускают только одно значение NULL - уникальный индекс, с другой стороны, может обойти это, добавив предложение WHERE (WHERE col IS NOT NULL) на SQL Server 2008 и выше).

+0

Не уверен, что это просто информационное дифференцирование, но 'sys.indexes' имеет столбец' is_unique_constraint', чтобы определить, определяется ли индекс как ограничение, а не уникальный индекс. –

+1

@ Andre Yep, это столбец в метаданных, так что * user * может определить, был ли он первоначально объявлен как ограничение. Это ничего не говорит о намерениях, и физическая реализация самого индекса - и соблюдение уникальности - одинакова. –

10

Еще одна вещь, которая стоит упомянуть, заключается в том, что если вы создаете индекс, вы можете указать включенные столбцы, это может помочь вашему SQL-коду работать быстрее, если есть какой-либо поиск по country_name.

CREATE UNIQUE NONCLUSTERED INDEX IX_UQ_Bar 
ON dbo.foo (
    bar 
) 
INCLUDE (foo_other_column) 
GO 

SELECT foo_other_column FROM Foo WHERE bar = 'test' 

SQL-сервер будет хранить «foo_other_column» в самом индексе. В случае уникального ограничения он сначала найдет индекс «test», затем будет искать строку в таблице foo, и только там она примет «foo_other_column».

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