Первичный ключ таблиц SQL
Какой лучше использовать Guid или Int Primary Key? некоторые результаты поиска предпочитают Guid, а другие - Int. так каковы на самом деле плюсы и минусы каждого.
2 ответа
Для SQL Server я лично использую INT IDENTITY
для большинства моих первичных и кластерных ключей.
Вам нужно отделить первичный ключ, который является логической конструкцией - он однозначно идентифицирует ваши строки, он должен быть уникальным, стабильным и NOT NULL
, GUID
хорошо работает и для первичного ключа - поскольку он гарантированно будет уникальным. GUID
поскольку ваш первичный ключ является хорошим выбором, если вы используете репликацию SQL Server, так как в этом случае вам все равно нужен уникально идентифицирующий столбец GUID.
Ключ кластеризации в SQL Server - это физическая конструкция, используемая для физического упорядочения данных, и его намного сложнее понять. Как правило, королева индексирования на SQL Server, Кимберли Трипп, также требует, чтобы хороший ключ кластеризации был уникальным, стабильным, как можно более узким и в идеале постоянно увеличивающимся (что INT IDENTITY
является).
Смотрите ее статьи об индексации здесь:
- GUID как первичные ключи и / или ключ кластеризации
- Дискуссия по кластерному индексу продолжается...
- Постоянно растущий ключ кластеризации - Дебаты о кластеризованных индексах.......... снова!
- Дисковое пространство дешево - ЭТО НЕ ТОЧКА
а также см. "Стоимость GUID" Джимми Нильссона в качестве первичного ключа.
GUID - это действительно плохой выбор для ключа кластеризации, поскольку он широкий, абсолютно случайный и, следовательно, приводит к плохой фрагментации индекса и низкой производительности. Кроме того, строки ключей кластеризации также хранятся в каждой записи каждого некластеризованного (дополнительного) индекса, так что вы действительно хотите сохранить его небольшим - GUID
16 байт против INT
4 байта, и с несколькими некластеризованными индексами и несколькими миллионами строк, это делает ОГРОМНОЕ различие.
В SQL Server ваш первичный ключ по умолчанию является вашим ключом кластеризации, но это не обязательно. Вы можете легко использовать GUID в качестве своего некластерного первичного ключа и INT IDENTITY
как ваш ключ кластеризации - просто нужно немного знать об этом.
Поскольку целочисленные первичные ключи являются последовательными (при условии автоинкремента), будет проще записывать строки в БД. Идентификаторы GUID являются по существу случайными, поэтому вставка строки может вызвать разбиение страницы и снизить скорость вставки. Если вы действительно хотите использовать GUID в качестве PK, рассмотрите newsequentialid
функция, которая гарантирует, что GUID производятся в порядке.