Индекс по умолчанию на первичном ключе

SQL Server создает индекс на первичных ключах по умолчанию? Если да, какой индекс? Если не, какой индекс подходит для выборов первичным ключом?

Я использую SQL Server 2008 R2

Спасибо.

15
задан Shayan 20 July 2010 в 16:14
поделиться

3 ответа

Вы можете легко определить первую часть этого для себя

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, чтобы прочитать больше об этих вопросах.

16
ответ дан 1 December 2019 в 01:45
поделиться

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

Что касается подходящего выбора, я бы сказал, что для 80-90% таблиц, которые вы создаете, вы обычно хотите, чтобы кластеризованный индекс был первичным ключом, но это не всегда так.

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

* Обычно это делается путем использования столбца INT IDENTITY в качестве PK в таблице.

11
ответ дан 1 December 2019 в 01:45
поделиться

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

2
ответ дан 1 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: