Универсальный уникальный идентификатор (UUID) — это 16-байтовое значение, используемое для идентификации записей. Подробную информацию о UUID см. в Википедии.
Хотя существуют разные варианты UUID, например UUIDv4 и UUIDv7 (см. здесь), ClickHouse не проверяет, соответствуют ли вставленные UUID какому-либо конкретному варианту.
Внутренне UUID рассматриваются как последовательность из 16 случайных байтов с представлением 8-4-4-4-12 на уровне SQL.
Пример значения UUID:
61f0c404-5cb3-11e7-907b-a6006ad3dba0
UUID по умолчанию состоит из всех нулей. Он используется, например, когда вставляется новая запись, но значение для столбца UUID не указано:
00000000-0000-0000-0000-000000000000
По историческим причинам UUID сортируются по второй половине.Хотя для значений UUIDv4 это нормально, для столбцов UUIDv7, используемых в определениях первичного индекса, это может ухудшать производительность (использование в ключах сортировки или ключах партиционирования допустимо).
Точнее, значения UUIDv7 состоят из временной метки в первой половине и счётчика — во второй.
Поэтому сортировка UUIDv7 в разреженных индексах первичного ключа (то есть по первым значениям каждой гранулы индекса) будет выполняться по полю счётчика.
Если бы UUID сортировались по первой половине (временной метке), то на этапе анализа индекса первичного ключа в начале запросов, как ожидается, отсекались бы все marks во всех частях, кроме одной.
Однако при сортировке по второй половине (счётчику), как ожидается, для всех частей будет возвращаться как минимум одна mark, что приводит к лишним обращениям к диску.
Пример:
CREATE TABLE tab (uuid UUID) ENGINE = MergeTree PRIMARY KEY (uuid);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
SELECT * FROM tab;
┌─uuid─────────────────────────────────┐
│ 019d2555-7874-7e9d-a284-9b45a0b2f165 │
│ 019d2555-7874-7e9d-a284-9b46c3353be7 │
│ 019d2555-7878-77fc-a36f-4081aa58ec2b │
│ 019d2555-7878-77fc-a36f-40826555fb9b │
│ 019d2555-7870-7432-ba62-5250ac595328 │
│ 019d2555-7870-7432-ba62-5251da22bd19 │
│ 019d2555-786c-73e9-a031-4a7936df7d56 │
│ 019d2555-786c-73e9-a031-4a7a35a9544f │
│ 019d2555-7868-7333-89d1-2bd1639899c3 │
│ 019d2555-7868-7333-89d1-2bd297eb7d42 │
└──────────────────────────────────────┘
В качестве обходного решения UUID можно преобразовать во временную метку, извлечённую из его второй половины:
CREATE TABLE tab (uuid UUID) ENGINE = MergeTree PRIMARY KEY (UUIDv7ToDateTime(uuid));
-- Или как вариант: [...] PRIMARY KEY (toStartOfHour(UUIDv7ToDateTime(uuid)));
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
INSERT INTO tab SELECT generateUUIDv7() FROM numbers(2);
SELECT * FROM tab;
Результат (при условии, что вставлены те же данные):
┌─uuid─────────────────────────────────┐
│ 019d2555-7868-7333-89d1-2bd1639899c3 │
│ 019d2555-7868-7333-89d1-2bd297eb7d42 │
│ 019d2555-786c-73e9-a031-4a7936df7d56 │
│ 019d2555-786c-73e9-a031-4a7a35a9544f │
│ 019d2555-7870-7432-ba62-5250ac595328 │
│ 019d2555-7870-7432-ba62-5251da22bd19 │
│ 019d2555-7874-7e9d-a284-9b45a0b2f165 │
│ 019d2555-7874-7e9d-a284-9b46c3353be7 │
│ 019d2555-7878-77fc-a36f-4081aa58ec2b │
│ 019d2555-7878-77fc-a36f-40826555fb9b │
└──────────────────────────────────────┘
ORDER BY (UUIDv7ToDateTime(uuid), uuid)
ClickHouse предоставляет функцию generateUUIDv4 для генерации случайных UUID версии 4.
Пример 1
В этом примере показано, как создать таблицу со столбцом UUID и вставить в неё значение.
CREATE TABLE t_uuid (x UUID, y String) ENGINE=TinyLog
INSERT INTO t_uuid SELECT generateUUIDv4(), 'Example 1'
SELECT * FROM t_uuid
┌────────────────────────────────────x─┬─y─────────┐
│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │
└──────────────────────────────────────┴───────────┘
Пример 2
В этом примере при вставке записи значение столбца UUID не указывается, то есть используется значение UUID по умолчанию:
INSERT INTO t_uuid (y) VALUES ('Example 2')
SELECT * FROM t_uuid
┌────────────────────────────────────x─┬─y─────────┐
│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │
│ 00000000-0000-0000-0000-000000000000 │ Example 2 │
└──────────────────────────────────────┴───────────┘
Тип данных UUID поддерживает только те функции, которые поддерживаются и типом данных String (например, min, max и count).
Тип данных UUID не поддерживает арифметические операции (например, abs) и агрегатные функции, такие как sum и avg. Последнее изменение 10 июня 2026 г.