ClickHouse에서 테이블 만들기

ClickHouse에서 테이블 만들기

ClickHouse도 대부분의 데이터베이스처럼 테이블을 논리적으로 데이터베이스(database) 단위로 묶어요. CREATE DATABASE로 데이터베이스를 만들고, CREATE TABLE로 테이블을 정의하며, 특히 테이블 엔진과 기본 키(primary key)의 역할을 이해하는 게 중요해요.

출처: Creating tables in ClickHouse

본문

대부분의 데이터베이스처럼 ClickHouse도 테이블을 논리적으로 데이터베이스로 묶어요. 새로운 데이터베이스를 만들려면 CREATE DATABASE 명령을 사용하세요:

CREATE DATABASE IF NOT EXISTS helloworld

마찬가지로 새 테이블을 정의할 때는 CREATE TABLE을 사용해요. 데이터베이스 이름을 지정하지 않으면 테이블은 default 데이터베이스에 만들어져요. 아래 my_first_table 테이블은 helloworld 데이터베이스에 생성돼요:

CREATE TABLE helloworld.my_first_table
(
    user_id UInt32,
    message String,
    timestamp DateTime,
    metric Float32
)
ENGINE = MergeTree()
PRIMARY KEY (user_id, timestamp)

위 예시에서 my_first_table은 네 개의 컬럼을 가진 MergeTree 테이블이에요:

  • user_id: 32비트 부호 없는 정수(unsigned integer)
  • message: String 데이터 타입. 다른 데이터베이스 시스템의 VARCHAR, BLOB, CLOB 같은 타입들을 대체해요
  • timestamp: DateTime 값. 시간상의 한 순간(instant)을 나타내요
  • metric: 32비트 부동소수점 숫자

테이블 엔진은 다음을 결정해요:

  • 데이터를 어디에, 어떻게 저장할지
  • 어떤 쿼리를 지원할지
  • 데이터가 복제(replicated)될지 여부

선택할 수 있는 엔진이 많지만, 단일 노드 ClickHouse 서버의 단순한 테이블에는 MergeTree가 가장 적합한 선택이에요.

기본 키에 대한 짧은 소개

더 진행하기 전에 ClickHouse에서 기본 키가 어떻게 동작하는지 이해하는 게 중요해요 (구현 방식이 예상과 다를 수 있거든요!):

  • ClickHouse의 기본 키는 테이블의 각 행에 대해 고유(unique)하지 않아요

ClickHouse 테이블의 기본 키는 데이터가 디스크에 기록될 때 어떻게 정렬되는지를 결정해요. 행 8,192개 또는 10MB의 데이터마다(인덱스 세분성, index granularity) 기본 키 인덱스 파일에 엔트리를 하나 만들게 되죠. 이 세분성 개념은 메모리에 쉽게 들어갈 수 있는 스파스 인덱스(sparse index) 를 만들어 내요. 그리고 그 granule은 SELECT 쿼리 중에 처리되는 가장 작은 단위의 컬럼 데이터 띠(stripe)를 나타내요.

기본 키는 PRIMARY KEY 매개변수로 정의할 수 있어요. PRIMARY KEY를 지정하지 않고 테이블을 정의하면, ORDER BY 절에 지정한 튜플이 키가 되어요. PRIMARY KEYORDER BY를 둘 다 지정했다면, 기본 키는 정렬 순서의 접두사(prefix)여야 해요. 기본 키는 정렬 키이기도 한데, 여기서는 (user_id, timestamp) 튜플이에요. 그래서 각 컬럼 파일에 저장된 데이터는 user_id로 먼저, 그다음 timestamp 순서로 정렬돼요.

더 자세한 내용은 ClickHouse Academy의 Modeling Data 트레이닝 모듈을 확인해 보세요.

더 알아보기 (Learn more)