메인 콘텐츠로 건너뛰기
범용 고유 식별자(UUID)는 레코드를 식별하는 데 사용되는 16바이트 값입니다. UUID에 대한 자세한 내용은 Wikipedia를 참조하십시오. UUIDv4, UUIDv7 등 다양한 UUID 변형이 존재하지만(여기 참조), ClickHouse는 삽입된 UUID가 특정 변형을 준수하는지 검증하지 않습니다. UUID는 내부적으로 16개의 임의 바이트로 이루어진 시퀀스로 처리되며, SQL 수준에서는 8-4-4-4-12 표현을 사용합니다. 예시 UUID 값:
61f0c404-5cb3-11e7-907b-a6006ad3dba0
기본 UUID는 모든 자리가 0입니다. 예를 들어 새 레코드가 삽입되었지만 UUID 컬럼 값이 지정되지 않은 경우에 사용됩니다:
00000000-0000-0000-0000-000000000000
역사적인 이유로 UUID는 뒤 절반을 기준으로 정렬됩니다.이는 UUIDv4 값에는 문제가 없지만, 프라이머리 인덱스 정의에 사용되는 UUIDv7 컬럼에서는 성능이 저하될 수 있습니다(순서 지정 키 또는 파티션 키에 사용하는 경우는 괜찮습니다). 좀 더 구체적으로 말하면, UUIDv7 값은 앞 절반에 타임스탬프가 있고 뒤 절반에 counter가 있습니다. 따라서 희소 프라이머리 인덱스의 UUIDv7 정렬(즉, 각 인덱스 granule의 첫 번째 값)은 counter 필드를 기준으로 이루어집니다. UUID가 앞 절반(타임스탬프)을 기준으로 정렬된다고 가정하면, 쿼리 시작 시 수행되는 프라이머리 키 인덱스 분석 단계에서 하나의 파트를 제외한 모든 파트의 모든 마크를 가지치기할 수 있을 것으로 예상됩니다. 그러나 뒤 절반(counter)을 기준으로 정렬하면 모든 파트에서 적어도 하나의 마크가 반환될 것으로 예상되며, 이로 인해 불필요한 디스크 접근이 발생합니다.
예시:
Query
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;
Response
┌─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를 뒷부분에서 추출한 타임스탬프로 변환할 수 있습니다:
Query
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;
결과(같은 데이터가 삽입되었다고 가정):
Response
┌─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)

UUID 생성

ClickHouse는 무작위 UUID 버전 4 값을 생성하는 generateUUIDv4 함수를 제공합니다.

사용 예시

예시 1 이 예시에서는 UUID 컬럼이 있는 테이블을 생성하고 해당 테이블에 값을 삽입하는 방법을 보여 줍니다.
Query
CREATE TABLE t_uuid (x UUID, y String) ENGINE=TinyLog

INSERT INTO t_uuid SELECT generateUUIDv4(), 'Example 1'

SELECT * FROM t_uuid
Response
┌────────────────────────────────────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와 같은 집계 함수를 지원하지 않습니다.
마지막 수정일 2026년 6월 10일