5

Вы можете создать кластерный индекс в столбце, отличном от столбца первичного ключа, если указано ограничение некластеризованного первичного ключа. http://msdn.microsoft.com/en-us/library/ms186342.aspxПервичный ключ всегда индексируется в sql-сервере?

Так выше сказал мне: я могу создать кластерный индекс, отличные от столбцов первичного ключа.

Я думаю, что он также передает, что первичный ключ должен быть либо некластеризованным первичным ключом, либо кластеризованным ключом. Возможно ли, что первичный ключ не проиндексирован?

Что больше:

При создании UNIQUE ограничения, уникальный некластеризованный индекс создан для обеспечения ограничения уникальности по умолчанию. Вы можете указать уникальный кластеризованный индекс, если кластерный индекс в таблице еще не существует.

Означает ли это, что уникальное ограничение должно создавать кластеризованный индекс или некластеризованный индекс?

ответ

12

Возможно ли, что первичный ключ не проиндексирован?

Нет, это не так.

Для защиты PRIMARY KEY требуется какой-либо индекс, в противном случае потребовалось бы сканирование всей таблицы на каждую вставку (для обеспечения уникальности).

docs От:

Компонент Database Engine автоматически создает уникальный индекс для обеспечения соблюдения требования единственности PRIMARY KEY ограничения. Если кластерный индекс еще не существует в таблице или некластеризованный индекс явно не указан, создается уникальный кластерный индекс для принудительного ограничения PRIMARY KEY.


Означает ли это уникальное ограничение должно создать кластерный индекс или некластеризованный индекс?

Да, по тем же причинам.


PRIMARY KEY и UNIQUE логические понятия, в то время как индекс только имеет побочный эффект реализации их эффективно. Итак, строго говоря, ALTER TABLE ADD CONSTRAINT UNIQUE и CREATE UNIQUE INDEX означают разные вещи.

Если в будущем какая-то светлая голова намеревается использовать принцип Паули или квантовое запутывание или что-то еще, чтобы обеспечить уникальность на физическом уровне, SQL Server 2155 может использовать его для принудительного ограничения, но ему все равно придется создать B -Триф для индекса.

+1

Я думаю, что ответ может вводить в заблуждение в зависимости от названия вопроса. Ответ: да, pk всегда индексируется. – JonH

+0

Намного больше спасибо. – JonH

1

Короткий ответ: Нет,

Каждая таблица в SQL Server должен иметь только один кластерный индекс. Другие индексы (некластеризованные) используют из кластерного индекса.Основной ключ - это кластеризованный индекс. Но первичный ключ всегда индексируется в отличие от внешнего ключа.

http://www.sqlfiddle.com/#!6/972f0/1 
+0

* каждый стол ... должен иметь только один кластеризованный индекс * - каждая таблица может ** НИКОГДА никогда не иметь более одного кластерного индекса! Это не ограничение * не должно * - это фиксированное ограничение ** CAN NOT **. Невозможно иметь более одного кластерного индекса. –