UUID
Универсальный уникальный идентификатор (UUID) — это 16-байтовое значение, используемое для идентификации записей. Подробную информацию о UUID см. в статье на Википедии.
Хотя существуют разные варианты UUID, например UUIDv4 и UUIDv7 (см. здесь), ClickHouse не проверяет, соответствуют ли вставленные значения UUID какому-либо конкретному варианту. Внутри ClickHouse UUID рассматриваются как последовательность из 16 случайных байт с представлением 8-4-4-4-12 на уровне SQL.
Пример значения UUID:
UUID по умолчанию состоит из одних нулей. Он используется, например, когда вставляется новая запись, но для столбца с типом UUID не задано значение:
По историческим причинам UUID сортируются по своей второй половине.
Хотя для значений UUIDv4 это приемлемо, это может ухудшать производительность при использовании столбцов UUIDv7 в определениях первичного индекса (их использование в сортировочных ключах или ключах партиционирования допустимо). Более конкретно, значения UUIDv7 состоят из временной метки в первой половине и счетчика во второй половине. Сортировка UUIDv7 в разреженных индексах первичного ключа (то есть по первым значениям каждой гранулы индекса) будет, таким образом, выполняться по полю счетчика. Если предположить, что UUID сортировались бы по первой половине (временной метке), то на этапе анализа индекса по первичному ключу в начале выполнения запросов ожидается отсечение всех меток во всех, кроме одной, частях. Однако при сортировке по второй половине (счетчику) ожидается, что как минимум одна метка будет возвращена для всех частей, что приводит к ненужным обращениям к диску.
Пример:
Результат:
В качестве обходного решения UUID можно преобразовать в метку времени, извлечённую из второй половины:
ORDER BY (UUIDv7ToDateTime(uuid), uuid)
Генерация UUID
ClickHouse предоставляет функцию generateUUIDv4 для генерации случайных UUID версии 4.
Пример использования
Пример 1
Этот пример демонстрирует создание таблицы со столбцом UUID и вставку значения в таблицу.
Результат:
Пример 2
В этом примере при вставке записи значение для столбца UUID не указывается, то есть вставляется значение UUID по умолчанию:
Ограничения
Тип данных UUID поддерживает только те функции, которые также поддерживает тип данных String (например, min, max и count).
Тип данных UUID не поддерживает арифметические операции (например, abs) и агрегатные функции, такие как sum и avg.