메인 콘텐츠로 건너뛰기
효율적인 데이터 수집은 고성능 ClickHouse 배포의 기반입니다. 적절한 삽입 전략을 선택하면 처리량, 비용, 안정성에 큰 차이가 생길 수 있습니다. 이 섹션에서는 워크로드에 맞는 결정을 내릴 수 있도록 모범 사례, 장단점, 구성 옵션을 설명합니다.
아래 내용은 클라이언트를 통해 ClickHouse로 데이터를 푸시하는 경우를 가정합니다. s3gcs와 같은 기본 제공 테이블 함수를 사용해 ClickHouse로 데이터를 가져오는 경우에는 “S3 삽입 및 읽기 성능 최적화” 가이드를 참조하시기 바랍니다.

기본적으로는 동기 삽입

기본적으로 ClickHouse에 대한 삽입은 동기식으로 처리됩니다. 각 삽입 쿼리는 메타데이터와 인덱스를 포함하는 저장 파트를 디스크에 즉시 생성합니다.
클라이언트 측에서 데이터를 일괄 처리할 수 있다면 동기 삽입을 사용하세요그렇지 않다면 아래의 비동기 삽입을 참조하세요.
아래에서 ClickHouse의 MergeTree 삽입 메커니즘을 간략히 살펴보겠습니다:

클라이언트 측 단계

최적의 성능을 위해 데이터는 ① 배치로 묶어야 하며, 따라서 배치 크기를 정하는 것이 첫 번째 결정 사항입니다. ClickHouse는 삽입된 데이터를 디스크에, 정렬된 상태로 테이블의 프라이머리 키(primary key) 컬럼 기준으로 저장합니다. 두 번째 결정 사항은 서버로 전송하기 전에 데이터를 ② 미리 정렬할지 여부입니다. 배치가 프라이머리 키 컬럼 기준으로 미리 정렬된 상태로 도착하면, ClickHouse는 ⑩ 정렬 단계를 건너뛸 수 있어 수집 속도가 빨라집니다. 수집할 데이터에 미리 정해진 포맷이 없다면, 핵심 결정 사항은 포맷을 선택하는 것입니다. ClickHouse는 70개가 넘는 포맷으로 데이터 삽입을 지원합니다. 하지만 ClickHouse command-line client 또는 프로그래밍 언어 클라이언트를 사용할 때는 이 선택이 자동으로 처리되는 경우가 많습니다. 필요한 경우 이 자동 선택을 명시적으로 재정의할 수도 있습니다. 다음 주요 결정 사항은 ④ ClickHouse 서버로 전송하기 전에 데이터를 압축할지 여부입니다. 압축은 전송 크기를 줄이고 네트워크 효율성을 높여, 특히 대규모 데이터셋에서 더 빠른 데이터 전송과 더 적은 대역폭 사용으로 이어집니다. 데이터는 ⑤ ClickHouse 네트워크 인터페이스, 즉 네이티브 또는 HTTP 인터페이스를 통해 전송됩니다(이 둘은 이 글의 뒤에서 비교합니다).

서버 측 단계

⑥ 데이터를 수신한 후, ClickHouse는 압축이 사용된 경우 ⑦ 이를 압축 해제하고, 이어서 원래 전송된 포맷에서 ⑧ 이를 파싱합니다. 해당 포맷의 데이터 값과 대상 테이블의 DDL 문을 바탕으로, ClickHouse는 MergeTree 포맷의 메모리 상 블록을 ⑨ 생성하고, 행이 이미 미리 정렬되어 있지 않으면 ⑩ 프라이머리 키 컬럼을 기준으로 정렬하며, ⑪ 희소 프라이머리 인덱스를 생성하고, ⑫ 컬럼별 압축을 적용한 뒤, ⑬ 데이터를 새로운 ⑭ 데이터 파트로 디스크에 기록합니다.

동기식일 경우 배치 삽입

위 메커니즘은 삽입 크기와 관계없이 일정한 오버헤드가 발생함을 보여줍니다. 따라서 배치 크기는 수집 처리량을 높이기 위한 가장 중요한 최적화 요소입니다. 배치 삽입을 사용하면 전체 삽입 시간에서 오버헤드가 차지하는 비중이 줄어들고 처리 효율도 향상됩니다. 데이터는 최소 1,000행 단위로 배치 삽입하고, 이상적으로는 10,000~100,000행 사이로 삽입하는 것을 권장합니다. 삽입 횟수를 줄이고 한 번에 더 크게 삽입하면 기록되는 파트 수가 줄어들고, 머지 부하를 최소화할 수 있으며, 전체 시스템 리소스 사용량도 낮아집니다. 동기식 삽입 전략을 효과적으로 사용하려면 클라이언트 측 배칭이 필요합니다. 클라이언트 측에서 데이터를 배치로 묶을 수 없는 경우, ClickHouse는 서버 측에서 배칭을 수행하는 asynchronous inserts를 지원합니다(Asynchronous inserts 보기).
삽입 크기와 관계없이 삽입 쿼리 수는 초당 약 1개 수준으로 유지하는 것을 권장합니다. 그 이유는 생성된 파트가 백그라운드에서 더 큰 파트로 머지되기 때문입니다(읽기 쿼리에 맞게 데이터를 최적화하기 위해 수행됩니다). 초당 너무 많은 삽입 쿼리를 보내면 백그라운드 머지가 새로 생성되는 파트 수를 따라가지 못할 수 있습니다. 다만 asynchronous inserts를 사용하는 경우에는 초당 더 높은 삽입 쿼리 속도를 사용할 수 있습니다(Asynchronous inserts 참조).

멱등성이 보장되는 재시도

동기 삽입도 멱등적입니다. MergeTree 엔진을 사용할 때 ClickHouse는 기본적으로 삽입을 중복 제거합니다. 이는 다음과 같이 성공 여부가 불분명한 실패 상황으로부터 보호합니다.
  • 삽입은 성공했지만 네트워크 중단으로 인해 클라이언트가 확인 응답을 받지 못했습니다.
  • 서버 측에서 삽입이 실패한 뒤 시간 초과가 발생했습니다.
두 경우 모두 배치의 내용과 순서가 완전히 동일하게 유지되는 한 삽입을 재시도해도 안전합니다. 따라서 클라이언트는 데이터를 수정하거나 순서를 바꾸지 않고 일관되게 재시도해야 합니다.

올바른 삽입 대상 선택

샤딩된 cluster에서는 두 가지 옵션이 있습니다:
  • MergeTree 또는 ReplicatedMergeTree 테이블에 직접 삽입합니다. 클라이언트가 세그먼트 간 부하 분산을 수행할 수 있다면 이것이 가장 효율적인 방법입니다. internal_replication = true를 사용하면 ClickHouse가 복제를 투명하게 처리합니다.
  • 분산 테이블에 삽입합니다. 이렇게 하면 클라이언트가 어느 노드로든 데이터를 보낼 수 있고, ClickHouse가 이를 올바른 세그먼트로 전달합니다. 더 단순하지만 추가 전달 단계가 있으므로 성능은 약간 떨어집니다. 이 경우에도 internal_replication = true를 권장합니다.
ClickHouse Cloud에서는 모든 노드가 동일한 단일 세그먼트에 읽기 및 쓰기를 수행합니다. 삽입은 노드 간에 자동으로 분산됩니다. 제공된 엔드포인트로 삽입을 보내면 됩니다.

적절한 포맷 선택

ClickHouse에서 효율적으로 데이터를 수집하려면 적절한 입력 형식을 선택하는 것이 매우 중요합니다. 지원되는 포맷이 70개가 넘기 때문에, 가장 성능이 좋은 옵션을 선택하면 삽입 속도, CPU 및 메모리 사용량, 전반적인 시스템 효율성에 큰 차이가 날 수 있습니다. 유연성은 데이터 엔지니어링 작업과 파일 기반 가져오기에 유용하지만, 애플리케이션에서는 성능 중심 포맷을 우선해야 합니다:
  • Native 형식 (권장): 가장 효율적입니다. 컬럼 지향 방식이며, 서버 측에서 파싱이 거의 필요하지 않습니다. Go 및 Python 클라이언트에서 기본으로 사용됩니다.
  • RowBinary: 효율적인 행 기반 포맷으로, 클라이언트 측에서 컬럼 지향 변환이 어려울 때 적합합니다. Java 클라이언트에서 사용됩니다.
  • JSONEachRow: 사용하기 쉽지만 파싱 비용이 큽니다. 적은 양의 데이터 처리나 빠른 통합에 적합합니다.

압축 사용

압축은 네트워크 오버헤드를 줄이고, 삽입 속도를 높이며, ClickHouse의 스토리지 비용을 낮추는 데 중요한 역할을 합니다. 압축을 효과적으로 사용하면 데이터 포맷이나 스키마를 변경하지 않고도 수집 성능을 향상할 수 있습니다. 삽입 데이터를 압축하면 네트워크를 통해 전송되는 페이로드 크기가 줄어들어 대역폭 사용을 최소화하고 전송 속도를 높일 수 있습니다. 삽입에서는 압축을 Native 형식과 함께 사용할 때 특히 효과적입니다. Native 형식은 이미 ClickHouse의 내부 열 지향 스토리지 모델과 일치합니다. 이 구성에서는 서버가 최소한의 변환만으로 데이터를 효율적으로 압축 해제해 직접 저장할 수 있습니다.

속도가 중요하면 LZ4, 압축률이 중요하면 ZSTD를 사용하십시오

ClickHouse는 데이터 전송 중 여러 압축 코덱을 지원합니다. 대표적으로 많이 사용하는 옵션은 다음과 같습니다.
  • LZ4: 빠르고 가볍습니다. CPU 오버헤드를 거의 늘리지 않으면서 데이터 크기를 크게 줄여 주므로, 처리량이 높은 삽입에 적합하며 대부분의 ClickHouse 클라이언트에서 기본값으로 사용됩니다.
  • ZSTD: 압축률은 더 높지만 CPU 사용량이 더 많습니다. 리전 간 전송이나 클라우드 제공업체 환경처럼 네트워크 전송 비용이 높은 경우에 유용하지만, 클라이언트 측 컴퓨트와 서버 측 압축 해제 시간이 약간 늘어납니다.
모범 사례: 대역폭 제약이 있거나 데이터 egress 비용이 발생하는 경우가 아니라면 LZ4를 사용하고, 그런 경우에는 ZSTD를 고려하십시오.
FastFormats benchmark 테스트에서는 LZ4로 압축한 Native 삽입으로 데이터 크기를 50% 이상 줄였고, 5.6 GiB 데이터셋의 수집 시간을 150초에서 131초로 단축했습니다. ZSTD로 전환하면 동일한 데이터셋이 1.69 GiB까지 압축되었지만, 서버 측 처리 시간은 약간 증가했습니다.

압축은 리소스 사용량을 줄입니다

압축은 네트워크 트래픽을 줄일 뿐만 아니라 서버의 CPU 및 메모리 효율도 높입니다. 데이터가 압축되면 ClickHouse는 더 적은 바이트를 수신하고 대량의 입력을 파싱하는 데 드는 시간도 줄어듭니다. 이러한 이점은 관측성 시나리오처럼 여러 동시 클라이언트에서 수집할 때 특히 중요합니다. 압축이 CPU와 메모리에 미치는 영향은 LZ4의 경우 작고, ZSTD의 경우 중간 정도입니다. 부하가 걸린 상황에서도 데이터 양이 줄어들기 때문에 서버 측 효율은 향상됩니다. 압축을 배칭 및 효율적인 입력 형식(예: Native)과 함께 사용하면 최상의 수집 성능을 얻을 수 있습니다. 네이티브 인터페이스(예: clickhouse-client)를 사용할 때는 LZ4 압축이 기본적으로 활성화됩니다. 필요에 따라 설정을 통해 ZSTD로 전환할 수 있습니다. HTTP 인터페이스에서는 Content-Encoding 헤더를 사용해 압축을 적용하십시오(예: Content-Encoding: lz4). 전체 페이로드는 전송하기 전에 반드시 압축되어야 합니다.

비용이 낮을 때만 사전 정렬

삽입 전에 데이터를 프라이머리 키 기준으로 미리 정렬하면 ClickHouse의 수집 효율을 높일 수 있으며, 특히 대규모 배치에서 효과적입니다. 데이터가 미리 정렬된 상태로 들어오면 ClickHouse는 파트 생성 중 내부 정렬 단계를 건너뛰거나 단순화할 수 있어 CPU 사용량을 줄이고 삽입 과정을 가속할 수 있습니다. 또한 사전 정렬은 유사한 값이 함께 묶이므로 압축 효율도 높아지며, 그 결과 LZ4나 ZSTD 같은 코덱이 더 높은 압축률을 달성할 수 있습니다. 이는 대규모 배치 삽입과 압축을 함께 사용할 때 특히 유리하며, 처리 오버헤드와 전송되는 데이터 양을 모두 줄여 줍니다. 다만 사전 정렬은 선택적인 최적화일 뿐, 필수는 아닙니다. ClickHouse는 병렬 처리를 사용해 데이터를 매우 효율적으로 정렬하며, 많은 경우 서버 측 정렬이 클라이언트 측 사전 정렬보다 더 빠르거나 더 편리합니다. 데이터가 이미 거의 정렬되어 있거나 클라이언트 측 리소스(CPU, 메모리)가 충분하고 여유가 있을 때만 사전 정렬을 권장합니다. 관측성과 같이 지연 시간에 민감하거나 처리량이 높은 사용 사례에서는 데이터가 순서 없이 도착하거나 많은 에이전트에서 들어오는 경우가 많으므로, 사전 정렬을 생략하고 ClickHouse의 기본 성능에 맡기는 편이 더 나은 경우가 많습니다.

비동기 삽입

ClickHouse의 비동기 삽입은 클라이언트 측 배칭이 어렵거나 적합하지 않을 때 강력한 대안이 됩니다. 이는 특히 수백 개 또는 수천 개의 에이전트가 로그, 메트릭, 트레이스 데이터를 지속적으로, 대개는 작은 실시간 payload로 전송하는 관측성 워크로드에서 매우 유용합니다. 이러한 환경에서 클라이언트 측 버퍼링을 사용하면 충분히 큰 batch를 보낼 수 있도록 중앙 집중식 큐가 필요해져 복잡성이 커집니다.
동기 모드에서 작은 batch를 많이 전송하는 것은 권장되지 않습니다. 이 경우 많은 파트가 생성되어 쿼리 성능이 저하되고 “too many part” 오류가 발생할 수 있습니다.
비동기 삽입은 들어오는 데이터를 메모리 내 버퍼에 기록한 뒤, 구성 가능한 임계값에 따라 스토리지에 플러시함으로써 배칭 책임을 클라이언트에서 서버로 옮깁니다. 이 방식은 파트 생성 오버헤드를 크게 줄이고, CPU 사용량을 낮추며, 높은 동시성에서도 수집이 효율적으로 유지되도록 합니다. 핵심 동작은 async_insert 설정으로 제어됩니다. 비동기 삽입은 HTTP와 네이티브 TCP 인터페이스 모두에서 지원됩니다. 활성화되면 (async_insert = 1) 삽입은 버퍼링되며, 다음 플러시 조건 중 하나를 충족할 때만 디스크에 기록됩니다: 가장 먼저 도달한 임계값이 플러시를 트리거합니다. 이 배칭 과정은 클라이언트에 보이지 않으며, ClickHouse가 여러 소스에서 들어오는 삽입 트래픽을 효율적으로 머지하는 데 도움이 됩니다. 다만 플러시가 일어나기 전까지는 데이터를 쿼리할 수 없습니다. 중요한 점은 삽입 shape와 설정 조합별로 여러 버퍼가 존재하고, 클러스터에서는 노드별로 버퍼가 유지된다는 것입니다. 이를 통해 멀티 테넌트 환경 전반에서 세밀하게 제어할 수 있습니다. 그 밖의 삽입 메커니즘은 동기 삽입에서 설명한 내용과 동일합니다.

반환 모드 선택

비동기 삽입의 동작은 wait_for_async_insert 설정으로 더 세밀하게 조정할 수 있습니다. 이 값을 1(기본값)로 설정하면 ClickHouse는 데이터가 디스크에 성공적으로 플러시된 후에만 삽입을 승인합니다. 이렇게 하면 강력한 내구성이 보장되고 오류 처리도 단순해집니다. 즉, 플러시 중 문제가 발생하면 해당 오류가 클라이언트에 반환됩니다. 이 모드는 대부분의 프로덕션 환경, 특히 삽입 실패를 신뢰성 있게 추적해야 하는 경우에 권장됩니다. 벤치마크에 따르면 적응형 삽입과 안정적인 파트 생성 방식 덕분에 200개 클라이언트든 500개 클라이언트든 높은 동시성에서도 우수하게 확장됩니다. wait_for_async_insert = 0으로 설정하면 “fire-and-forget” 모드가 활성화됩니다. 이 경우 서버는 데이터가 저장소에 기록될 때까지 기다리지 않고, 데이터가 버퍼에 적재되는 즉시 삽입을 승인합니다. 이 방식은 매우 낮은 지연 시간의 삽입과 최대 처리량을 제공하므로, 빠르게 유입되지만 중요도가 낮은 데이터에 적합합니다. 하지만 그만큼의 대가도 따릅니다. 데이터가 영구 저장된다는 보장이 없고, 오류는 플러시 중에만 드러나며, 실패한 삽입을 위한 데드 레터 큐도 없습니다. 따라서 실패를 추적하려면 사후에 서버 로그와 시스템 테이블을 점검해야 합니다. 워크로드가 데이터 손실을 감수할 수 있는 경우에만 이 모드를 사용하십시오. 벤치마크에서도 버퍼 플러시가 드문 경우(예: 30초마다) 파트 수가 크게 줄고 CPU 사용량도 낮아지는 것으로 나타났지만, 조용한 실패의 위험은 여전히 남아 있습니다. 비동기 삽입을 사용하는 경우 async_insert=1,wait_for_async_insert=1을 사용할 것을 강력히 권장합니다. wait_for_async_insert=0을 사용하는 것은 매우 위험합니다. 오류가 발생해도 INSERT 클라이언트가 이를 인지하지 못할 수 있으며, ClickHouse 서버가 서비스의 신뢰성을 보장하기 위해 쓰기 속도를 늦추고 백프레셔를 형성해야 하는 상황에서도 클라이언트가 계속 빠르게 쓰기를 수행해 잠재적인 과부하를 초래할 수 있기 때문입니다.

적응형 비동기 삽입

ClickHouse는 버전 24.2부터 기본적으로 적응형 플러시 타임아웃(async_insert_use_adaptive_busy_timeout)을 사용합니다. 고정된 플러시 인터벌 대신, 유입되는 데이터 속도에 따라 타임아웃이 최소값(async_insert_busy_timeout_min_ms, 기본값 50 ms)과 최대값(async_insert_busy_timeout_max_ms, 기본값 200 ms, Cloud에서는 1000 ms) 사이에서 동적으로 조정됩니다. 데이터가 자주 들어오면 더 빨리 플러시되어 엔드 투 엔드 지연 시간이 줄어들도록 타임아웃이 최소값에 가깝게 유지됩니다. 데이터가 희소하면 더 큰 배치를 모을 수 있도록 최대값 쪽으로 증가합니다. 이는 특히 기본 모드(wait_for_async_insert=1)에서 유용합니다. 고정된 높은 타임아웃을 사용하면 플러시할 데이터가 이미 준비되어 있어도 클라이언트가 전체 인터벌 동안 대기해야 하기 때문입니다.

오류 처리

스키마 검증과 데이터 파싱은 삽입이 수신될 때가 아니라 버퍼가 플러시될 때 수행됩니다. 삽입 쿼리의 행 중 하나라도 파싱 또는 유형 오류가 있으면 해당 쿼리의 데이터는 전혀 플러시되지 않으며 쿼리의 전체 payload가 거부됩니다. 기본 모드(wait_for_async_insert=1)에서는 오류가 클라이언트에 반환됩니다. fire-and-forget 모드에서는 오류가 서버 로그와 system.asynchronous_inserts 테이블에 기록됩니다. 각 플러시는 버퍼 내에서 서로 다른 각 파티션 키 값마다 최소 1개의 파트를 생성합니다. 파티션 키가 없는 테이블에서도 버퍼링된 데이터가 max_insert_block_size (기본값 약 100만 행)를 초과하면 한 번의 플러시로 여러 파트가 생성될 수 있습니다.
비동기 삽입을 사용하더라도 파티셔닝 키의 cardinality가 높으면 “too many parts” 오류가 발생할 수 있습니다.

중복 제거 및 안정성

기본적으로 ClickHouse는 동기 삽입에 대해 자동 중복 제거를 수행하므로, 장애 상황에서 재시도해도 안전합니다. 하지만 비동기 삽입에서는 명시적으로 활성화하지 않는 한 이 기능이 비활성화됩니다(종속된 materialized view가 있는 경우에는 활성화하지 마십시오 — issue 참조). 실제로 중복 제거가 활성화되어 있으면, 예를 들어 timeout이나 네트워크 연결 끊김으로 인해 동일한 삽입을 다시 시도하더라도 ClickHouse가 중복 데이터를 안전하게 무시할 수 있습니다. 이렇게 하면 멱등성을 유지하고 데이터가 두 번 기록되는 것을 방지할 수 있습니다.

비동기 삽입 활성화

비동기 삽입은 특정 사용자 또는 특정 쿼리에 대해 활성화할 수 있습니다.
  • 사용자 수준에서 비동기 삽입을 활성화할 수 있습니다. 이 예시에서는 사용자 default를 사용합니다. 다른 사용자를 생성했다면 해당 사용자 이름으로 바꾸십시오.
    ALTER USER default SETTINGS async_insert = 1
    
  • 삽입 쿼리의 SETTINGS 절을 사용해 비동기 삽입 설정을 지정할 수 있습니다.
    INSERT INTO YourTable SETTINGS async_insert=1, wait_for_async_insert=1 VALUES (...)
    
  • ClickHouse 프로그래밍 언어 클라이언트를 사용할 때는 연결 매개변수로 비동기 삽입 설정을 지정할 수도 있습니다. 예를 들어, ClickHouse Cloud에 연결할 때 ClickHouse Java JDBC 드라이버를 사용한다면 JDBC 연결 문자열에서 다음과 같이 설정할 수 있습니다.
    "jdbc:ch://HOST.clickhouse.cloud:8443/?user=default&password=PASSWORD&ssl=true&custom_http_params=async_insert=1,wait_for_async_insert=1"
    
비동기 삽입은 INSERT INTO ... SELECT 쿼리에는 적용되지 않습니다. 삽입에 SELECT 절이 포함된 경우에는 async_insert 설정과 관계없이 쿼리가 항상 동기식으로 실행됩니다.

종료 시 버퍼 플러시

정상 종료 중이거나 유지 관리 전에 보류 중인 모든 비동기 삽입 버퍼를 플러시하려면 다음을 실행하십시오:
SYSTEM FLUSH ASYNC INSERT QUEUE
이를 통해 서버가 중지되기 전에 버퍼링된 데이터가 모두 스토리지에 기록됩니다.

Buffer 테이블과의 비교

비동기 삽입은 Buffer 테이블을 대체하는 최신 방식입니다. 주요 차이점은 다음과 같습니다.
  • DDL 변경이 필요하지 않습니다. 비동기 삽입은 투명하게 동작하므로 추가 테이블을 생성할 필요 없이 설정만 활성화하면 됩니다.
  • 쿼리 shape별 버퍼링. 비동기 삽입은 고유한 각 쿼리 shape와 설정 조합마다 별도의 버퍼를 유지하므로 세분화된 플러시 정책을 적용할 수 있습니다. Buffer 테이블은 대상 테이블마다 단일 버퍼를 사용합니다.
  • 내구성. 기본 모드(wait_for_async_insert=1)에서는 클라이언트가 확인 응답을 받기 전에 데이터가 디스크에 기록된 것이 보장됩니다. Buffer 테이블은 fire-and-forget 방식으로 동작하므로 장애가 발생하면 버퍼링된 데이터가 손실됩니다.
  • 클러스터 동작. 클러스터에서는 비동기 삽입 버퍼가 노드별로 유지됩니다. Buffer 테이블은 각 노드에 명시적으로 생성해야 합니다.

인터페이스 선택하기—HTTP 또는 네이티브

네이티브

ClickHouse는 데이터 수집을 위한 두 가지 주요 인터페이스, 즉 네이티브 인터페이스HTTP 인터페이스를 제공합니다. 각 인터페이스는 성능과 유연성 측면에서 서로 다른 장단점이 있습니다. clickhouse-client와 Go, C++ 같은 일부 언어 클라이언트에서 사용하는 네이티브 인터페이스는 성능에 최적화되도록 설계되었습니다. 이 인터페이스는 항상 ClickHouse의 매우 효율적인 Native 형식으로 데이터를 전송하고, LZ4 또는 ZSTD를 사용하는 블록 단위 압축을 지원하며, 구문 분석 및 포맷 변환 같은 작업을 클라이언트로 넘겨 서버 측 처리를 최소화합니다. 또한 클라이언트 측에서 MATERIALIZED 및 DEFAULT 컬럼 값을 계산할 수 있으므로 서버는 이 단계를 완전히 건너뛸 수 있습니다. 따라서 네이티브 인터페이스는 효율성이 중요한 고처리량 수집 시나리오에 이상적입니다.

HTTP

많은 기존 데이터베이스와 달리 ClickHouse는 HTTP 인터페이스도 지원합니다. 반대로 HTTP 인터페이스는 호환성과 유연성에 더 중점을 둡니다. 이를 사용하면 지원되는 모든 포맷으로 데이터를 전송할 수 있으며(JSON, CSV, Parquet 등 포함), Python, Java, JavaScript, Rust를 비롯한 대부분의 ClickHouse 클라이언트에서 폭넓게 지원됩니다. 이 방식은 로드 밸런서를 통해 트래픽을 쉽게 전환할 수 있으므로 ClickHouse의 네이티브 프로토콜보다 더 적합한 경우가 많습니다. 네이티브 프로토콜은 오버헤드가 약간 더 적기 때문에 삽입 성능에서 소폭의 차이가 날 수 있습니다. 하지만 네이티브 프로토콜만큼 긴밀하게 통합되지는 않으며, 값 구체화 계산이나 Native 형식으로의 자동 변환과 같은 클라이언트 측 최적화도 수행할 수 없습니다. HTTP 삽입에서도 표준 HTTP 헤더(예: Content-Encoding: lz4)를 사용해 압축할 수 있지만, 압축은 개별 데이터 블록이 아니라 전체 payload에 적용됩니다. 따라서 이 인터페이스는 순수 성능보다 프로토콜 단순성, 로드 밸런싱, 또는 폭넓은 포맷 호환성이 더 중요한 환경에서 선호되는 경우가 많습니다. 이러한 인터페이스에 대한 자세한 설명은 여기를 참조하십시오.
마지막 수정일 2026년 6월 10일