ClickHouse INSERT INTO

ClickHouse INSERT INTO (INSERT INTO)

INSERT INTO 문은 테이블에 데이터를 삽입해요. VALUES 목록 또는 ClickHouse가 지원하는 포맷으로 데이터를 넣을 수 있어요. 데이터는 컬러너 방식(columnar)이라 배치 삽입이 중요해요.

기본 문법은 이래요.

INSERT INTO [TABLE] [db.]table [(c1, c2, c3)] [SETTINGS ...] VALUES (v11, v12, v13), (v21, v22, v23), ...
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT format_name data_set

출처: https://clickhouse.com/docs/sql-reference/statements/insert-into

VALUES 삽입

INSERT INTO insert_select_testtable (*) VALUES (1, 'a', 1);

EXCEPT 수정자로 일부 컬럼을 제외할 수 있어요.

INSERT INTO insert_select_testtable (* EXCEPT(b)) VALUES (2, 2);

그 결과 b 컬럼은 기본값으로 채워져요. 컬럼 목록에 없는 나머지 컬럼은:

  • 테이블 정의의 DEFAULT 표현식으로 채워져요.
  • DEFAULT가 없으면 0과 빈 문자열이 채워져요.

DEFAULT 키워드로 명시적으로 기본값을 넣을 수도 있어요.

INSERT INTO insert_select_testtable VALUES (1, DEFAULT, 1);

FORMAT 삽입

데이터를 ClickHouse가 지원하는 어떤 포맷으로든 보낼 수 있어요. 포맷은 쿼리에서 명시해야 해요.

INSERT INTO t FORMAT TabSeparated
11  Hello, world!
22  Qwerty

FORMAT 절 뒤의 모든 내용은 데이터로 취급돼요. 그래서 SETTINGSFORMAT 앞에 써야 해요.

INSERT INTO table SETTINGS ... FORMAT format_name data_set

참고로 ClickHouse는 데이터 앞의 모든 공백과 줄바꿈(하나)을 제거해요. 데이터가 공백으로 시작하면 쿼리 연산자 뒤 새 줄에 데이터를 놓는 걸 권장해요.

대량 삽입 팁

ClickHouse는 컬럼 지향이라 소량·빈번한 삽입보다 대량·드문 삽입이 효율적이에요. INSERT ... SELECT로 테이블 간 복사도 가능하고, 각 삽입은 새 파트를 만들어 백그라운드 병합을 거쳐요. 가능하면 데이터를 모아 한 번에 삽입하는 게 성능에 좋아요.

더 알아보기