Подтвердить что ты не робот

Неплохо ли использовать GUID в качестве первичных ключей в MS SQL?

У нас есть система, которая использует UniqueIdentifier в качестве первичного ключа для каждой из таблиц. На наш взгляд, это плохая идея. Я видел подобный пост по этому вопросу, но меня интересует любая производительность MS SQL и другие потенциальные проблемы, с которыми я могу столкнуться в связи с этим решением.

4b9b3361

Ответ 1

Есть плюсы и минусы:

Эта статья охватывает все.

GUID Pros

  • Уникально для каждой таблицы, каждой базы данных, каждого сервера
  • Позволяет легко объединять записи из разных баз данных.
  • Позволяет легко распределять базы данных на нескольких серверах.
  • Вы можете создавать идентификаторы в любом месте, вместо того, чтобы совершать кругооборот в базу данных
  • В большинстве сценариев репликации требуются столбцы GUID в любом случае

Недостатки GUID

  • Это 4 раза больше, чем традиционное 4-байтовое значение индекса; это может иметь серьезные последствия для производительности и хранения, если вы не будете осторожны.
  • Громоздко отлаживать (где userid = '{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • Сгенерированные идентификаторы GUID должны быть частично последовательными для обеспечения максимальной производительности (например, newsequentialid() в SQL 2005) и для включения кластеризованных индексов

Ответ 2

Я написал сообщение об этой прошлой неделе с некоторым кодом, чтобы показать вам, что происходит: Простой код, чтобы показать разницу между Newid и Newsequentialid

В принципе, если вы используете newid() вместо Newsequentialid(), вы получаете ужасные разбиения страниц, если ваш PK является кластеризованным индексом (который будет по умолчанию)

Ответ 3

Лично я использую int или bigint для PK, но просто помещаю в другой столбец "Guid" для тех ситуаций, где вам нужен неопознанный "ключ" для этой записи, и генерировать Guid, когда вы вставляете строку.

Ответ 4

Это будет плохо, если вам нужно будет присоединяться к большим наборам (скажем, 100 000-х). Был там, пострадал.

Позднее Edit: я также столкнулся с еще худшей ошибкой (не могу назвать это "подход" ): сохранение GUID в столбцах char (36)!

Ответ 5

GUID - это мощный тип данных для идентификации строки, поскольку он почти гарантирован, чтобы быть уникальным. Это позволяет использовать много гибких функций, например, вы можете генерировать Guid в уровне приложений, что может значительно упростить сохранение ваших отношений.

Как было сказано, большой недостаток - это разбиение на страницы, которое произойдет, если ваш ПК является кластеризованным индексом; однако вы можете решить это двумя способами. Вы можете использовать NewSequentialId(), или вы можете установить PK для некластеризации. Я бы рекомендовал вам создать свою базу данных на основе ваших требований к данным, и если вам нужен GUID, используйте ее, а затем оптимизируйте вокруг нее. И подтвердите свою эффективность в своей среде.

Ответ 7

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

Ответ 8

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

Ответ 9

Плохо, если вы хотите быстро записывать в базу данных. Если вы собираетесь делать массивные вставки, лучше использовать другой тип данных.

Ответ 10

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

Ответ 11

Я бы не сказал его bad, как таковой. Я говорил со многими людьми, которые клянутся этим, хотя я нахожу это немного подробным. Я бы согласился с routeNpingme и сказал, что вы должны использовать регулярное целое число для ID, но также включать GUID (который вам нужен для репликации в любом случае) "на всякий случай"

Ответ 12

Если вы делаете какие-либо репликации базы данных, то GUID - ваш лучший друг!