SQL GUID против целого - PullRequest
       18

SQL GUID против целого

13 голосов
/ 10 мая 2010

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

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

Например, скажем, у вас было две связанные таблицы; Product и ProductType - я мог бы легко перепроверить столбец «ProductTypeID» обеих таблиц для конкретной строки, чтобы быстро отобразить данные в моей голове, потому что легко хранить число (2,4,45 и т. Д.) В отличие от (E75B92A3 3299-4407-A913-C5CA196B3CAB).

Дополнительное разочарование приходит от меня, желающего понять, как связаны таблицы, к сожалению, нет диаграммы базы данных: (

Многие люди говорят, что GUID лучше, потому что вы можете определить уникальный идентификатор в своем коде C #, например, используя NewID (), не требуя SQL SERVER, чтобы это сделать - это также позволяет вам временно узнать, каким будет ID. ... но я видел, что возможно также получить «следующее автоматически увеличенное целое число».

Подрядчик DBA сообщил, что наши запросы могли бы быть на 30% быстрее, если бы мы использовали тип Integer вместо GUIDS ...

Почему существует тип данных GUID, какие преимущества он действительно дает? ... Даже если какой-то профессионал выбрал его, должны быть веские причины для его применения?

Ответы [ 6 ]

17 голосов
/ 10 мая 2010

GUID в некоторых случаях хороши в качестве полей идентификации:

  • Если у вас есть несколько экземпляров SQL (разные серверы), и вам нужно объединить различные обновления позже, не затрагивая ссылочную целостность
  • Отключенные клиенты, которые создают данные - таким образом они могут создавать данные, не беспокоясь о том, что поле идентификатора уже занято

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

14 голосов
/ 10 мая 2010

Вопреки тому, что большинство людей здесь, кажется, проповедуют, я считаю, что GUID скорее чума, чем благословение. И вот почему:

Идентификаторы GUID могут показаться естественным выбором для вашего первичного ключа - и, если вам действительно нужно, вы, вероятно, можете поспорить, что он будет использоваться для ПЕРВИЧНОГО КЛЮЧА таблицы. Я бы настоятельно рекомендовал не делать , а использовать столбец GUID в качестве ключа кластеризации , что SQL Server делает по умолчанию, если вы специально не запретите.

Вам действительно нужно держать в стороне две проблемы:

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

  2. ключ кластеризации (столбец или столбцы, которые определяют «кластеризованный индекс» в таблице) - это физическая вещь, связанная с хранилищем, и здесь, маленький, стабильный, постоянно растущий тип данных - ваш лучший выбор - INT или BIGINT в качестве варианта по умолчанию.

По умолчанию первичный ключ в таблице SQL Server также используется в качестве ключа кластеризации, но это не обязательно должно быть именно так! Я лично наблюдал значительное увеличение производительности, когда разбивал предыдущий первичный / кластерный ключ на основе GUID на два отдельных ключа - первичный (логический) ключ на GUID и ключ кластеризации (упорядочения) на отдельном INT IDENTITY (1, 1) столбец.

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

Да, я знаю - в SQL Server 2005 и более поздних версиях newsequentialid() - но даже это не совсем и полностью последовательно и, следовательно, также страдает от тех же проблем, что и GUID - только чуть менее заметно. Кроме того, вы можете использовать его только по умолчанию для столбца в вашей таблице - вы не можете получить новый последовательный GUID в коде T-SQL (например, триггер или что-то еще) - еще один существенный недостаток.

Затем следует рассмотреть еще одну проблему: ключ кластеризации в таблице будет добавлен к каждой записи в каждом и каждом некластеризованном индексе в вашей таблице - таким образом, вы действительно хотите убедиться, что он как можно меньше. , Как правило, INT с 2+ миллиардами строк должно быть достаточно для подавляющего большинства таблиц - и по сравнению с GUID в качестве ключа кластеризации вы можете сэкономить сотни мегабайт хранилища на диске и в памяти сервера.

Быстрый расчет - использование INT и GUID в качестве первичного ключа и ключа кластеризации:

  • Базовая таблица с 1 000 000 строк (3,8 МБ против 15,26 МБ)
  • 6 некластеризованных индексов (22,89 МБ против 91,55 МБ)

ИТОГО: 25 МБ против 106 МБ - и это только на одном столе!

Еще немного пищи для размышлений - отличные вещи Кимберли Триппа - прочитайте это, прочитайте это снова, переварите это! Это на самом деле индексное Евангелие SQL Server.

Марк

6 голосов
/ 10 мая 2010

INT

Advantage

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

Неудобство

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

* GUID 1018 *

Преимущество

Уникальный для всего сервера.

Неудобство

Строковые значения не так оптимальны, как целочисленные значения для производительности при использовании в соединениях, индексах и условиях. Требуется больше места для хранения, чем INT.

Кредит идет на: http://blog.sqlauthority.com/2010/04/28/sql-server-guid-vs-int-your-opinion/

3 голосов
/ 10 мая 2010

Существует масса статей для Google по использованию GUID в качестве PK, и почти все они говорят то же самое, что говорит ваш подрядчик DBA - запросы выполняются быстрее без GUID в качестве ключей.

Основное использование, которое я видел на практике (мы никогда не использовали их в качестве PK), - это репликация. Страница MSDN для uniqueidentifier говорит о том же.

2 голосов
/ 10 мая 2010

Это глобально уникально, так что каждая запись в вашей таблице имеет GUID, который не используется ни одним другим элементом в мире. Удобно, если вам нужен такой вид эксклюзивной идентификации (если вы реплицируете базу данных или комбинируете данные из нескольких источников). В противном случае ваш dba верен - GUID намного больше и менее эффективен, чем целые числа, и вы могли бы ускорить ваш db (30%? Может быть ...)

0 голосов
/ 10 мая 2010

Они в основном спасают вас от более сложной логики использования

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