SQL GUID Vs Integer

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

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Как Kimberly Tripp - Королева Индексации - и другие заявили много раз - GUID, поскольку ключ кластеризации не является оптимальным, поскольку из-за его случайности это приведет к массивной фрагментации страниц и индексов и, как правило, к плохой производительности.

Да, я знаю - там newsequentialid() в SQL Server 2005 и выше - но даже это не является поистине и полностью последовательным и, следовательно, также страдает от тех же проблем, что и 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 индексирование евангелия.

Марк

Ответ 3

INT

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

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

Неудобство:

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

GUID

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

Уникальный сервер.

Неудобство:

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

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

Ответ 4

Есть тысячи статей, посвященных использованию GUID в качестве ПК, и почти все они говорят то же самое, что говорит ваш подрядчик по DBA - запросы быстрее, чем GUID в качестве ключей.

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

Ответ 5

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

Ответ 6

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

set @InsertID = scope_identity()