2016-09-04 31 views
2

Я новичок в SQL Server, и, изучая кластерный индекс, я запутался!Является уникальным ключевым кластеризированным или некластеризованным индексом в SQL Server?

Уникальный ключевой кластеризованный или некластеризованный индекс? Уникальный ключ содержит только уникальные значения в столбце, включая нуль, поэтому в соответствии с этой концепцией уникальный ключ должен быть кластеризованным индексом, не так ли? Но когда я прошел через эту статью я запуталась MSDN

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

Пожалуйста, помогите мне лучше понять концепцию, спасибо.

+1

Символ 'unique' ключ не является кластерным, если вы явно не определить его с помощью "кластерной" опции' создать index'. –

+0

Это объясняется немного лучше в http://stackoverflow.com/questions/1251636/what-do-clustered-and-non-clustered-index-actually-mean и https://msdn.microsoft.com/en-CA /library/ms190457.aspx. – yelxe

ответ

3

Существует три способа обеспечения уникальности индексов SQL Server.

  • ограничение первичного ключа
  • Уникального ограничение
  • Уникальный индекс (не ограничение, на основе)

ли они сгруппированы или не кластерным ортогонально или нет объявлены индексы уникального использования любой из этих методов.

Все три метода могут создавать кластерный или некрупный индекс.

По умолчанию уникальный индекс ограничений и уникальный индекс создаст некластеризованный индекс, если вы не укажете каких-либо разных (и по умолчанию PK будет создан как CLUSTERED, если не существует конфликтного кластерного индекса), но вы можете явно указать CLUSTERED/NONCLUSTERED для любого из них.

Пример синтаксиса

CREATE TABLE T 
(
X INT NOT NULL, 
Y INT NOT NULL, 
Z INT NOT NULL 
); 

ALTER TABLE T ADD PRIMARY KEY NONCLUSTERED(X); 

--Unique constraint NONCLUSTERED would be the default anyway 
ALTER TABLE T ADD UNIQUE NONCLUSTERED(Y); 

CREATE UNIQUE CLUSTERED INDEX ix ON T(Z); 

DROP TABLE T; 

Для индексов, которые не указаны в качестве уникального SQL Server молча делает их уникальными каким-либо образом. Для кластеризованных индексов это делается путем добавления уникального файла для дублирования ключей. Для не кластеризованных индексов идентификатор строки (логический или физический) добавляется к ключу, чтобы гарантировать уникальность.

+0

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

+1

@ LijinJohn - У вас может быть только один первичный ключ для таблицы, и вы можете иметь только один кластерный индекс на таблицу, но они не должны быть одинаковыми. –

+0

Что я, как правило, учится на блогах msdn, заключается в том, что нет никакой разницы в данных между уникальным ключом и уникальными ограничениями, верно? –

0

Уникальный индекс может быть как кластеризованным, так и некластерным. Но если у вас есть столбец с нулевым значением, значение NULL должно быть уникальным (только 1 строка, где столбец равен NULL). Если вы хотите сохранить более 1 NULL, вы можете создать индекс с фильтром «где columnName не равно null».

1

также все ответы, было очень полезно, но все же я хотел бы добавить некоторые подробный ответ, так что я бы полезно для некоторых других, а также

  1. таблица может содержать только один кластерный индекс и первичный ключ может быть кластеризованным/некластеризованным индексом.
  2. уникальный ключ может быть кластерный/не кластерный индекс, а также, ниже приведены некоторые из примеров

Сценарий 1: Первичный ключ по умолчанию будет кластерный индекс

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

USE TempDB 
GO 
-- Create table 
CREATE TABLE TestTable 
(ID INT NOT NULL PRIMARY KEY, 
Col1 INT NOT NULL) 
GO 
-- Check Indexes 
SELECT OBJECT_NAME(OBJECT_ID) TableObject, 
[name] IndexName, 
[Type_Desc] FROM sys.indexes 
WHERE OBJECT_NAME(OBJECT_ID) = 'TestTable' 
GO 
-- Clean up 
DROP TABLE TestTable 
GO 

Сценарий 2: Первичный ключ определяется как некластеризованный индекс

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

USE TempDB 
GO 
-- Create table 
CREATE TABLE TestTable 
(ID INT NOT NULL PRIMARY KEY NONCLUSTERED, 
Col1 INT NOT NULL) 
GO 
-- Check Indexes 
SELECT OBJECT_NAME(OBJECT_ID) TableObject, 
[name] IndexName, 
[Type_Desc] FROM sys.indexes 
WHERE OBJECT_NAME(OBJECT_ID) = 'TestTable' 
GO 
-- Clean up 
DROP TABLE TestTable 
GO 

Сценарий 3: первичный ключ по умолчанию Индекса некластерированного с другим столбцом, определенным как кластерный индекс

В этом случае мы будем создавать кластерный индекс на другой столбец, SQL Server будет автоматически создать Первичный ключ как некластеризованный индекс как кластерный индекс указан в другом столбце.

-- Case 3 Primary Key Defaults to Non-clustered Index 
USE TempDB 
GO 
-- Create table 
CREATE TABLE TestTable 
(ID INT NOT NULL PRIMARY KEY, 
Col1 INT NOT NULL UNIQUE CLUSTERED) 
GO 
-- Check Indexes 
SELECT OBJECT_NAME(OBJECT_ID) TableObject, 
[name] IndexName, 
[Type_Desc] FROM sys.indexes 
WHERE OBJECT_NAME(OBJECT_ID) = 'TestTable' 
GO 
-- Clean up 
DROP TABLE TestTable 
GO 

Сценарий 4: первичный ключ по умолчанию индекс кластерным с другими индекса по умолчанию в некластеризованный индекс

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

-- Case 4 Primary Key and Defaults 
USE TempDB 
GO 
-- Create table 
CREATE TABLE TestTable 
(ID INT NOT NULL PRIMARY KEY, 
Col1 INT NOT NULL UNIQUE) 
GO 
-- Check Indexes 
SELECT OBJECT_NAME(OBJECT_ID) TableObject, 
[name] IndexName, 
[Type_Desc] FROM sys.indexes 
WHERE OBJECT_NAME(OBJECT_ID) = 'TestTable' 
GO 
-- Clean up 
DROP TABLE TestTable 
GO 

ссылка: the above details is been refrenced from this article