2012-05-22 3 views
31

Я создаю базу данных в SQL Server 2008,базы данных: первичный ключ, кластерный или NONCLUSTERED

CREATE TABLE Users 
(
    U_Id INT NOT NULL 
    FirstName VARCHAR(50) NOT NULL, 
    LastName VARCHAR(50) NOT NULL, 
    Email VARCHAR(200) 
    Password VARCHAR(50) 
) 

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

CONSTRAINT pk_UserID PRIMARY KEY (U_Id) 

это

CONSTRAINT pk_UserID PRIMARY KEY CLUSTERED (U_Id) 

и это

CONSTRAINT pk_UserID PRIMARY KEY NONCLUSTERED (U_Id) 

Когда использовать каждый?

Я прочитал статью, но мне все еще не ясно. Может кто-нибудь дать мне быстрое объяснение?

ответ

36

следующее заявление:

CONSTRAINT pk_UserID PRIMARY KEY (U_Id) 

То же самое, это один:

CONSTRAINT pk_UserID PRIMARY KEY CLUSTERED (U_Id) 

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

Если вы хотите оставить заказ данных таблицы, которые будут сохранены в соответствии с каким-либо другим индексом, то вы должны создать первичный ключ:

CONSTRAINT pk_UserID PRIMARY KEY NONCLUSTERED (U_Id) 

А затем создать кластерный индекс с:

CREATE CLUSTERED INDEX ix_Email ON Users (Email); 
+3

Просто имейте в виду, что любые некластеризованные индексы, которые вы создаете, всегда будут включать данные в кластеризованном индексе (поскольку именно так определяется фактическая строка данных в таблице). [Microsoft docs] (http://msdn.microsoft.com/en-us/library/ms177484.aspx) Поэтому не думайте, что вы будете экономить место, указав индекс большой/широкий как кластеризованный индекс, если только вы не имеют никаких других указателей на таблице. – Granger

+1

Первичный ключ - это идентификатор строки. Он должен быть уникальным, а не нулевым. Clustered Index сообщает SQL, как хранить данные на диске. Фактические строки данных хранятся в порядке, указанном этим индексом. Поскольку он также содержит данные о том, где данные хранятся на диске, кластерный индексный ключ хранится в каждом индексе. Почти во всех случаях лучше сделать их одинаковыми. И почти всегда лучше, чтобы первичный ключ был идентификатором, чтобы данные хранились на диске последовательно. – brianfeucht