Amazon Redshift SQL 번역 가이드
Amazon Redshift SQL 번역 가이드
Redshift에서 ClickHouse로 옮길 때 가장 먼저 맞닥뜨리는 게 데이터 타입과 DDL 문법의 차이예요. 이 문서는 Redshift 타입별 ClickHouse 대응 타입을 매핑하고, 정렬 키(sorting key) 같은 DDL 문법 차이를 정리해요.
본문
데이터 타입 (Data types)
ClickHouse와 Redshift 사이에서 데이터를 옮기는 사용자들은 ClickHouse가 더 광범위하면서도 덜 제한적인 타입 범위를 제공한다는 걸 바로 알게 돼요. Redshift는 가변 길이더라도 문자열 길이를 명시하도록 요구하지만, ClickHouse는 문자열을 인코딩 없이 바이트로 저장해서 사용자에게 그 제약과 부담을 덜어 줘요. 그래서 ClickHouse String 타입은 한도나 길이 명시 요구사항이 없어요.
게다가 Redshift에는 first-class citizen으로 없는 Arrays, Tuples, Enums을 활용할 수 있어요 (단, SUPER로 Arrays/Structs를 흉내 낼 수는 있음). 이는 사용자들이 자주 겪는 불편이죠. ClickHouse는 또한 쿼리 시점이나 심지어 테이블에 집계 상태(aggregation states)를 영속화하는 것을 허용해요. 이를 통해 보통 매터리얼라이즈드 뷰로 데이터를 사전 집계(pre-aggregate)할 수 있고, 자주 쓰이는 쿼리의 성능을 크게 개선할 수 있어요.
아래는 각 Redshift 타입에 대응하는 ClickHouse 타입 매핑이에요:
| Redshift | ClickHouse |
|---|---|
SMALLINT |
Int8 * |
INTEGER |
Int32 * |
BIGINT |
Int64 * |
DECIMAL |
UInt128, UInt256, Int128, Int256, Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S), Decimal256(S) — (고정밀도·넓은 범위 가능) |
REAL |
Float32 |
DOUBLE PRECISION |
Float64 |
BOOLEAN |
Bool |
CHAR |
String, FixedString |
VARCHAR ** |
String |
DATE |
Date32 |
TIMESTAMP |
DateTime, DateTime64 |
TIMESTAMPTZ |
DateTime, DateTime64 |
GEOMETRY |
Geo Data Types |
GEOGRAPHY |
Geo Data Types (덜 발달됨 — 예: 좌표계 없음. 함수로 에뮬레이션 가능) |
HLLSKETCH |
AggregateFunction(uniqHLL12, X) |
SUPER |
Tuple, Nested, Array, JSON, Map |
TIME |
DateTime, DateTime64 |
TIMETZ |
DateTime, DateTime64 |
VARBYTE ** |
String과 함께 Bit 및 Encoding 함수 결합 |
- ClickHouse는 또한 확장된 범위를 가진 부호 없는 정수, 즉
UInt8,UInt32,UInt64를 추가로 지원해요.
**ClickHouse의 String 타입은 기본적으로 무제한이지만, Constraints로 특정 길이로 제한할 수 있어요.
DDL 문법
정렬 키 (Sorting keys)
ClickHouse와 Redshift 둘 다 데이터가 저장될 때 어떻게 정렬되는지 정의하는 "정렬 키(sorting key)" 개념이 있어요. Redshift는 SORTKEY 절로 정렬 키를 정의해요:
CREATE TABLE some_table(...) SORTKEY (column1, column2)
반면 ClickHouse는 ORDER BY 절로 정렬 순서를 지정해요:
CREATE TABLE some_table(...) ENGINE = MergeTree ORDER BY (column1, column2)
대부분의 경우 기본 COMPOUND 타입을 사용한다면 Redshift와 동일한 정렬 키 컬럼과 순서를 ClickHouse에서 쓸 수 있어요. Redshift에 데이터를 추가할 때는 VACUUM과 ANALYZE 명령을 실행해서 새로 추가된 데이터를 재정렬하고 쿼리 플래너의 통계를 갱신해야 해요 — 그렇지 않으면 정렬되지 않은 공간이 계속 늘어나거든요. ClickHouse에는 그런 과정이 필요 없어요.
Redshift는 정렬 키에 대한 몇 가지 편의 기능을 지원해요. 첫째는 자동 정렬 키(SORTKEY AUTO)예요. 시작하기에는 적절할 수 있지만, 정렬 키가 최적일 때는 명시적 정렬 키가 최고의 성능과 저장 효율을 보장해요. 둘째는 INTERLEAVED 정렬 키로, 쿼리가 하나 이상의 보조 정렬 컬럼을 사용할 때 성능을 개선하기 위해 정렬 키의 컬럼 부분집합에 동일한 가중치를 부여해요. ClickHouse는 명시적 projections(프로젝션)을 지원하며, 약간 다른 설정으로 동일한 최종 결과를 달성해요.
"기본 키(primary key)" 개념은 ClickHouse와 Redshift에서 서로 다른 것을 의미한다는 점을 알아야 해요. Redshift에서 기본 키는 제약(constraint)을 강제하려는 전통적인 RDBMS 개념과 유사해요. 하지만 Redshift에서 엄격히 강제되지는 않으며, 쿼리 플래너와 노드 간 데이터 분산에 대한 힌트(hint) 역할을 해요. ClickHouse에서 기본 키는 스파스 기본 인덱스(sparse primary index)를 구성하는 데 사용되는 컬럼을 뜻하며, 데이터가 디스크에서 정렬되도록 보장해서 압축을 최대화하면서 기본 인덱스 오염과 메모리 낭비를 피하게 해요.