Для SQL Server я лично использую INT IDENTITY
для большинства моих первичных ключей и ключей кластеризации.
Вам необходимо отделить первичный ключ , который является логической конструкцией - он уникаленопределяет ваши строки, он должен быть уникальным и стабильным и NOT NULL
.GUID
хорошо работает и для первичного ключа - поскольку он гарантированно будет уникальным.GUID
в качестве первичного ключа является хорошим выбором, если вы используете репликацию SQL Server, поскольку в этом случае вам все равно необходим уникально идентифицирующий столбец GUID.
ключ кластеризации в SQLСервер - это физическая конструкция, используемая для физического упорядочения данных, и его намного сложнее понять.Как правило, Королева индексирования на SQL Server, Кимберли Трипп, также требует, чтобы хороший ключ кластеризации был уникальным, стабильным, как можно более узким и в идеальном случае постоянно увеличивающимся (каковым является INT IDENTITY
).
См. Ее статьи об индексации здесь:
, а также см. Джимми Нильссона Стоимость GUID в качестве первичного ключа
GUID - этодействительно плохой выбор для ключа кластеризации, так как он широкий, абсолютно случайный и, следовательно, приводит к плохой фрагментации индекса и низкой производительностиКроме того, строки ключей кластеризации также хранятся в каждой записи каждого некластеризованного (дополнительного) индекса, поэтому вы действительно хотите сохранить его небольшим - GUID
равно 16 байтам, а INT
равно4 байта, с несколькими некластеризованными индексами и несколькими миллионами строк, это имеет ОГРОМНОЕ различие.
В SQL Server ваш первичный ключ по умолчанию является вашим ключом кластеризации - но это не обязательно.Вы можете легко использовать GUID в качестве первичного ключа, не относящегося к кластеру, и INT IDENTITY
в качестве ключа кластеризации - вам просто нужно знать об этом.