SQL Server 2005: столбцы первичного ключа и столбцы таблицы - должны ли они быть в одинаковом порядке? - PullRequest
1 голос
/ 07 апреля 2011

Проверка концепции:

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

Но я не видел явного упоминания о корреляции между порядком столбцов в фактической таблице и первичным ключом .

Или, иначе говоря, если оптимальный порядок столбцов в PK равен (B, C, A), будет ли какое-либо влияние на производительность, если в таблице столбцы упорядочены как A, B, C (т. Е. Отличается от определения PK)?

create table ABC (
A int,
B varchar(10),
C int)

Мой опыт работы с SQL Server 2005, похоже, не имеет значения

Ответы [ 3 ]

3 голосов
/ 07 апреля 2011

«Порядок» столбцов в таблице является артефактом определения таблиц - одна из ключевых концепций реляционных баз данных заключается в том, что столбцы расположены по имени, а не по порядковому положению.

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

В другом примере все столбцы фиксированной длины упаковываются в начале строки. Итак, в вашем примере таблицы ABC порядок столбцов в каждой строке на диске будет на самом деле A, C, B (но с некоторыми дополнительными структурами, которые также появляются перед столбцом A и между C и B.

Короче говоря, нет, порядок столбцов в таблице не должен влиять.


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


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

3 голосов
/ 07 апреля 2011

Первичный ключ - это набор атрибутов. В принципе нет порядка в атрибутах ключа. К сожалению, SQL Server использует порядок, в котором имена столбцов указываются в синтаксисе создания ключа, чтобы определить порядок столбцов в индексе, который поддерживает этот ключ. Таким образом, вы должны думать об указанном порядке точно так же, как вы рассматриваете порядок столбцов в индексе.

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

2 голосов
/ 07 апреля 2011

Это не имеет значения и не имеет смысла (другой порядок)

...