Связь первичного ключа и кластеризованного индекса


может ли таблица иметь первичный ключ без кластеризованного индекса?

и может ли таблица иметь кластеризованный индекс без первичного ключа?

может ли кто-нибудь кратко рассказать мне о взаимосвязи первичного ключа и кластеризованного индекса?

6 74

6 ответов:

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

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

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

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

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

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

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

пример, где t1 имеет некластеризованный первичный ключ, и t2 не кластеризован, но имеет первичный ключ:

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

пример на скрипке SQL.

прежде всего, взгляните на Index-организованные таблицы и кластеризованные индексы. На самом деле, я рекомендую прочитать весь используйте индекс Люк! сайт с самого начала, пока вы не достигнете тему кластеризации, чтобы действительно понять, что происходит.

Теперь на ваши вопросы...


может ли таблица иметь первичный ключ без кластеризованного индекса?

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

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

это неудачно, так как многие люди, похоже, просто принимают значение по умолчанию (которое КЛАСТЕРИЗОВАНО), хотя во многих случаях таблица на основе кучи на самом деле была бы лучше (как описано в связанной статье).


и может ли таблица иметь кластеризованный индекс без первичного ключа?

В отличие от некоторых других СУБД, MS SQL Server позволит вам иметь индекс кластеризации, который отличается от первичного ключа, или даже без первичного ключа вообще.

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

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

Если вы выбрали не уникальный индекс кластеризации (используя CREATE CLUSTERED INDEX ...), MS SQL Server автоматически сделает его уникальным, добавив к нему скрытое поле.

обратите внимание, что преимущества кластеризации наиболее заметны для сканирование диапазона. Если вы используете индекс кластеризации, который не "выравнивается" с проверками диапазона, выполненными вашим клиентским приложением(например, при чрезмерной зависимости от скрытого столбца, упомянутого выше, или кластеризации на суррогатный ключ), вы в значительной степени лишает смысла кластеризации.


может ли кто-нибудь кратко рассказать мне о взаимосвязи первичного ключа и кластеризованного индекса?

в MS SQL Server первичный ключ также кластеризован по умолчанию. Вы можете изменить это значение по умолчанию, как описано выше.

ответы взяты из MSDN с использованием кластеризованных индексов

может ли таблица иметь первичный ключ без кластеризованного индекса? - да.

может ли таблица иметь кластеризованный индекс без первичного ключа? - да.

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

An индекс is автоматически назначается первичному ключу (поскольку строки часто "просматриваются" их первичным ключом).

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

A кластерный индекс когда фактический таблица физически упорядочена по определенному столбцу. Таблица не всегда будет иметь кластеризованный индекс (т. е. пока он будет физически упорядочен по что-то, эта штука может быть неопределено). Таблица не может иметь более одного кластеризованного индекса, хотя она может иметь один составной кластеризованный индекс (т. е. таблица физически упорядочена, например, фамилия, имя, DOB).

PK часто (но не всегда) является кластеризованным индексом.

Это может не относиться как ответ на этот вопрос, но некоторые важные аспекты первичного ключа и кластеризованных индексов ->

Если есть первичный ключ (по умолчанию это кластеризованный индекс, Однако мы можем его изменить) с кластеризованным индексом, то мы не можем создать еще один кластеризованный индекс для этой таблицы. Но если еще нет набора первичных ключей и есть кластеризованный индекс, то мы не можем создать первичный ключ с кластеризованным индексом.

для чего это может быть полезно, в MS SQL Server все столбцы в первичном ключе должны быть определены как NOT Null, в то время как создание уникального кластеризованного индекса не требует этого. Не уверен, что о других системах БД, хотя.