Открыть сервис

Тип данных UNIQUEIDENTIFIER

UNIQUEIDENTIFIER — это тип данных в системах управления базами данных (СУБД), предназначенный для хранения глобально уникальных идентификаторов (GUID). В отличие от целочисленных типов (INT), которые генерируются последовательно и могут повторяться в разных базах данных, значения типа UNIQUEIDENTIFIER уникальны в пространстве и времени, что делает их пригодными для использования в реплицируемых и распределённых системах.

История

Концепция глобально уникальных идентификаторов была разработана компанией Microsoft в начале 1990-х годов для идентификации COM-объектов (Component Object Model). Позднее она была адаптирована для реляционных баз данных. Впервые тип данных UNIQUEIDENTIFIER был реализован в СУБД Microsoft SQL Server версии 6.5 (выпуск 1996 года). С тех пор он стал стандартным средством для создания уникальных идентификаторов записей в различных СУБД, включая Microsoft SQL Server, Azure SQL, Sybase ASE, а с определёнными оговорками — PostgreSQL (тип UUID) и MySQL (тип CHAR(36) или начиная с версии 8.0 — встроенный тип BINARY(16) с функциями для работы с UUID). В PostgreSQL и MySQL тип не называется UNIQUEIDENTIFIER, но выполняет ту же функцию.

Формат хранения и структура

GUID (Globally Unique Identifier), хранящийся в типе UNIQUEIDENTIFIER, представляет собой 128-битное (16-байтовое) целое число. Для удобства чтения и передачи его принято отображать в виде 32 шестнадцатеричных цифр, сгруппированных в пять групп, разделённых дефисами. Стандартный формат строки GUID выглядит следующим образом:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

где x — шестнадцатеричная цифра (0–9, a–f). Каждая группа имеет фиксированное число символов: 8-4-4-4-12.

Технически GUID гарантирует уникальность за счёт комбинации временных меток, идентификатора сетевой платы (MAC-адреса) и других параметров, однако современный алгоритм (версия 4) использует 122 случайных бита, что даёт 2¹²² уникальных значений — практически неисчерпаемый запас.

Виды и методы генерации

Стандартные алгоритмы генерации GUID

По стандарту RFC 4122 существует несколько версий GUID:

Встроенные функции СУБД

В СУБД Microsoft SQL Server для генерации нового значения UNIQUEIDENTIFIER используется функция NEWID(). Она создаёт UUID версии 4 (случайный) на основе криптографического генератора случайных чисел операционной системы. Функция NEWSEQUENTIALID() генерирует идентификаторы, которые возрастают последовательно во времени, что снижает фрагментацию индексов, особенно на кластеризованных ключах, но не гарантирует полной уникальности при конкурентном доступе.

Для создания GUID на основе текстовой строки служит функция CONVERT(UNIQUEIDENTIFIER, 'значение'), которая интерпретирует строку как GUID (в формате xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). Если строка не соответствует формату, возникает ошибка преобразования.

Применение

В реплицируемых базах данных

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

Идентификация во внешних системах

GUID используется в качестве идентификатора объектов, которые должны быть доступны по единому ключу из разных служб или приложений (например, API-ключи, идентификаторы сессий, коды записи на приём). Это исключает зависимость от централизованного генератора последовательностей.

Как первичный ключ

Несмотря на свои достоинства, UNIQUEIDENTIFIER реже используется в качестве кластеризованного первичного ключа именно из-за проблем с производительностью (см. раздел «Производительность»). Вместо этого GUID часто хранится в отдельном столбце, а в качестве первичного ключа применяется автоинкремент (INT или BIGINT). При горизонтальном шардировании или репликации GUID может использоваться в качестве бизнес-ключа.

Случайная выборка

Функция NEWID() может применяться в SQL-запросах для для случайной сортировки строк. Выполнение ORDER BY NEWID() для каждой строки генерирует уникальный случайный GUID, после чего записи упорядочиваются по нему.

Производительность и недостатки

Размер данных

Значение UNIQUEIDENTIFIER занимает 16 байт, что в 4 раза больше, чем типовый целочисленный INT (4 байта) и в 2 раза больше, чем BIGINT (8 байт). Это увеличивает размер индексов и страниц данных, повышая нагрузку на ввод-вывод.

Фрагментация индексов

При использовании случайного GUID (например, в результате NEWID()) в качестве кластеризованного ключа новые записи вставляются в случайные позиции в индексе, а не в конец. Это приводит к активной фрагментации — постоянному перемещению страниц и разделению. Итог — снижение производительности вставок и обновлений.

Отладка и читаемость

GUID — нечеловеческая запись (32 шестнадцатеричных символа). По сравнению с INT (1, 2, 3...) GUID сложнее воспринимается людьми при отладке и ручном анализе данных.

Сравнение с другими типами данных

ХарактеристикаUNIQUEIDENTIFIERINTBIGINT
Размер хранения16 байт4 байта8 байт
УникальностьГлобальнаяВ пределах одной таблицыВ пределах одной таблицы
Возможность репликацииБез конфликтовВозможны конфликты ключейВозможны конфликты ключей
Скорость вставки (кластеризованный ключ)Низкая (фрагментация)Высокая (последовательная)Высокая (последовательная)
Человеко-читаемостьНизкаяВысокаяВысокая

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →