Является ли первичный ключ автоматически индексом? - PullRequest
14 голосов
/ 12 марта 2010

Если я запускаю 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]

Ответы [ 4 ]

24 голосов
/ 12 марта 2010

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

Если у вас нет другого кластеризованного индекса в таблице, то это просто: кластеризованный индекс делает таблицу быстрее для каждой операции. ДА! Оно делает. См. Превосходную Ким Трипп * Дебаты по кластерным индексам продолжаются для получения дополнительной информации.

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

6 голосов
/ 12 марта 2010

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

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

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

2 голосов
/ 12 марта 2010

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

1 голос
/ 12 марта 2010

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

...