Какова цель спецификации идентичности SQL - PullRequest
0 голосов
/ 26 июля 2011

Представьте, что у меня есть такая таблица:

CREATE TABLE [dbo].[Things](
    [Id] [uniqueidentifier] NOT NULL DEFAULT (newId()),
    [ThingName] [nvarchar](100) NOT NULL,
    [ThingCode] [int] NOT NULL
) ON [PRIMARY]

Было бы сложнее поддержать его, если бы я сделал столбец Id Identity . Есть ли какие-то соображения по поводу производительности или что-то, что заставляет меня передумать?

Спасибо

Ответы [ 3 ]

6 голосов
/ 26 июля 2011

Производительность: да. Столбец uniqueidentifier (GUID) подходит как первичный ключ, НО не как кластерный индекс. Создайте кластерный индекс для столбца (столбцов), который будет использоваться при поиске диапазона, и создайте некластеризованный индекс для столбца GUID.

В столбце uniqueidentifier (GUID) используется 16 байтов, поэтому объем используемого хранилища больше (и меньше строк помещается на странице базы данных), а пропускная способность, потребляемая при передаче данных, выше.

Основное использование GUID в качестве первичного ключа (более int или bigint) - это возможность назначать их на среднем уровне приложения, не обращаясь к базе данных в обоих направлениях, при этом избегая столкновений клавиш.

Если все, что вам нужно, это диапазон ключей больше целого (4 байта, 2 31 - 1), тогда используйте bigint (8 байтов), который поддерживает 2 63 - 1 строка (более чем достаточно для большинства приложений)

2 голосов
/ 26 июля 2011

uniqueidentifier - это поле большое , поэтому вы будете хранить и перемещать больше данных по сети - это одно из соображений производительности.

Дополнительно newid() (насколько я знаю) будет не генерировать последовательные идентификаторы, вызывая фрагментацию индекса, которая является основной проблемой производительности, если вы решите использовать столбец в качестве кластеризованного индекса.

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

1 голос
/ 26 июля 2011

Соединения быстрее для целых чисел, и по сети отправляется меньше информации, так что да, есть соображения производительности.однако, в зависимости от размера системы, это может не иметь большого значения.Также, как правило, проще выполнять специальные запросы, когда вам не нужно использовать такой большой идентификатор.Если идентификатор является чем-то открытым для пользователя (идентификатор человека часто используется в бизнес-приложениях, поскольку имя не уникально), то пользователи определенно предпочтут видеть и использовать целые числа.РУКОВОДСТВА хотя очень необходимы, если вы делаете репликацию.Реальный вопрос заключается в том, почему вы хотите использовать GUID.Ответ на этот вопрос - то, что действительно скажет вам, можете ли вы заменить личность или нет.

Вы должны использовать NEWSEQUENTIALID () вместо newID ().Вы также не должны позволять SQL Server помещать кластерный индекс в newId (), если вы его используете, или это вызовет проблемы с производительностью.Это происходит по умолчанию по первичному ключу (который, как я предполагаю, будет), но вы можете и должны изменить его, если используете newid ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...