Является ли первичный ключ автоматически индексом?

Если я запустил Profiler, то он предлагает множество индексов, подобных этой

CREATE CLUSTERED INDEX [_dta_index_Users_c_9_292912115__K1] ON [dbo].[Users] 
(
 [UserId] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, 
ONLINE = OFF) ON [PRIMARY]

UserId является основным ключом таблицы Users. Этот индекс лучше, чем тот, который уже находится в таблице:

ALTER TABLE [dbo].[Users] ADD  CONSTRAINT [PK_Users] PRIMARY KEY NONCLUSTERED 
(
 [UserId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, 
IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, 
ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

Ответ 1

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

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

Примечание: таблица без кластерного индекса называется "кучей", потому что это куча неструктурированных данных...

Ответ 2

Да, первичный ключ всегда является индексом.

Если у вас нет другого кластерного индекса в таблице, то это легко: кластерный индекс делает таблицу быстрее для каждой операции. ДА! Оно делает. См. Kim Tripp excellent Дискуссия в кластерном индексе продолжается для получения дополнительной информации.

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

Ответ 3

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

Ответ 4

Это лучше, потому что оно кластеризовано.