SQL Server создает индекс на первичных ключах по умолчанию? Если да, какой индекс? Если не, какой индекс подходит для выборов первичным ключом?
Я использую SQL Server 2008 R2
Спасибо.
Вы можете легко определить первую часть этого для себя
create table x
(
id int primary key
)
select * from sys.indexes where object_id = object_id('x')
Gives
object_id name index_id type type_desc is_unique data_space_id ignore_dup_key is_primary_key is_unique_constraint fill_factor is_padded is_disabled is_hypothetical allow_row_locks allow_page_locks
1653580929 PK__x__6383C8BA 1 1 CLUSTERED 1 1 0 1 0 0 0 0 0 1 1
Edit: Есть еще один случай, который я должен был упомянуть
create table t2 (id int not null, cx int)
create clustered index ixc on dbo.t2 (cx asc)
alter table dbo.t2 add constraint pk_t2 primary key (id)
select * from sys.indexes where object_id = object_id('t2')
Gives
object_id name index_id type type_desc is_unique data_space_id ignore_dup_key is_primary_key is_unique_constraint fill_factor is_padded is_disabled is_hypothetical allow_row_locks allow_page_locks has_filter filter_definition
----------- ------------------------------ ----------- ---- ------------------------------ --------- ------------- -------------- -------------- -------------------- ----------- --------- ----------- --------------- --------------- ---------------- ---------- ------------------------------
34099162 ixc 1 1 CLUSTERED 0 1 0 0 0 0 0 0 0 1 1 0 NULL
34099162 pk_t2 2 2 NONCLUSTERED 1 1 0 1 0 0 0 0 0 1 1 0 NULL
Что касается второй части, то нет золотого правила, это зависит от вашей индивидуальной рабочей нагрузки запроса, и что такое ваш PK.
Для удовлетворения индивидуальных поисков по первичному ключу подойдет некластеризованный индекс. Если вы выполняете запросы к диапазонам, то для них хорошо подойдет соответствующий кластеризованный индекс, но может подойти и охватывающий некластеризованный индекс.
Вам также необходимо учитывать ширину индекса кластерного индекса, в частности, поскольку она влияет на все ваши некластерные индексы и влияние вставок на разбиение страниц.
Я рекомендую книгу SQL Server 2008 Query Performance Tuning Distilled, чтобы прочитать больше об этих вопросах.
Да. По умолчанию для всех первичных ключей создается уникальный кластеризованный индекс, но вы можете создать уникальный некластеризованный индекс, если хотите.
Что касается подходящего выбора, я бы сказал, что для 80-90% таблиц, которые вы создаете, вы обычно хотите, чтобы кластеризованный индекс был первичным ключом, но это не всегда так.
Обычно кластеризованный индекс является чем-то другим, если вы выполняете интенсивное сканирование диапазона по этому "чему-то другому". Например, если у вас есть синтетический первичный ключ*, но есть столбец даты, который вы обычно запрашиваете в диапазоне, вы часто хотите, чтобы этот столбец даты был наиболее значимым столбцом в вашем кластеризованном индексе.
* Обычно это делается путем использования столбца INT IDENTITY в качестве PK в таблице.
Да, по умолчанию создается кластеризованный индекс на первичном ключе.