跳转到主要内容
通用唯一标识符 (UUID) 是一个 16 字节的值,用于标识记录。有关 UUID 的详细信息,请参阅 Wikipedia 虽然 UUID 有不同的变体,例如 UUIDv4 和 UUIDv7 (参见此处) ,但 ClickHouse 不会验证插入的 UUID 是否符合某一种特定变体。 在 SQL 层面,UUID 在内部被视为由 16 个随机字节组成的序列,并采用 8-4-4-4-12 表示形式 UUID 值示例:
默认 UUID 为全零。例如,插入新记录时,如果未为 UUID 列指定任何值,就会使用该值:
由于历史原因,UUID 会按其后半部分排序。这对 UUIDv4 值来说没有问题,但如果 UUIDv7 列用于定义主索引,则可能会导致性能下降 (用于排序键或分区键则没有问题) 。 更具体地说,UUIDv7 值的前半部分是时间戳,后半部分是计数器。 因此,在稀疏主键索引中对 UUIDv7 进行排序时 (即取每个索引粒度的第一个值) ,实际上会按计数字段排序。 如果 UUID 是按前半部分 (时间戳) 排序的,那么在查询开始时的主键索引分析步骤中,预计可以剪枝掉除一个 part 之外所有 part 中的全部标记。 然而,如果按后半部分 (计数器) 排序,则预计所有 parts 都至少会返回一个标记,从而导致不必要的磁盘访问。
示例:
Query
Response
作为一种权宜之计,可将 UUID 转换为从后半部分提取出的时间戳:
Query
结果 (假设插入了相同的数据) :
Response
ORDER BY (UUIDv7ToDateTime(uuid), uuid)

生成 UUID

ClickHouse 提供了 generateUUIDv4 函数,用于生成随机 UUIDv4 值。

使用示例

示例 1 本示例演示如何创建一个包含 UUID 列的表,并向该表插入一个值。
Query
Response
示例 2 在此示例中,插入记录时未指定 UUID 列的值,即会插入默认的 UUID 值:

限制

UUID 数据类型仅支持 String 数据类型同样支持的函数 (例如 minmaxcount) 。 UUID 数据类型不支持算术运算 (例如 abs) 以及聚合函数,例如 sumavg
最后修改于 2026年7月2日