-
[ClickHouse] min_insert_block_size_rows 설정 알아보기Database/Clickhouse 2024. 6. 2. 07:21728x90반응형
- 목차
들어가며.
ClickHouse 는 MergeTree 엔진을 통해 데이터를 효율적으로 관리합니다.
MergeTree 엔진은 데이터를 part 라는 단위로 관리하며, 각 part 는 데이터의 정렬된 블록을 포함합니다.
min_insert_block_size_rows 는 데이터 삽입(INSERT) 시 디스크로 데이터를 플러시(Flush)하는 기준이 되는 최소 행(row) 크기를 정의하는 중요한 설정입니다.
min_insert_block_size_rows 설정은 클라이언트가 INSERT 쿼리를 실행할 때, 디스크로 데이터를 플러시(Flush)하기 위한 최소 행(Row) 수를 정의하는 기준입니다.
예를 들어, min_insert_block_size_rows 값이 10으로 설정되어 있고, 클라이언트가 100개의 행을 INSERT하면, 총 10번의 플러시가 발생하며 10개의 part가 생성되는 구조를 취합니다.
https://westlife0615.tistory.com/737
https://westlife0615.tistory.com/565
min_insert_block_size_rows 란 ?
min_insert_block_size_rows 는 INSERT 작업에서 디스크로 플러시(Flush)할 수 있는 최소 행(Row) 수를 정의합니다.
기본값은 1,048,449 rows 로 설정되어 있으며, ClickHouse 의 버전에 따라 다를 수 있습니다.
이 설정은 배치(Batch) INSERT 쿼리에서만 동작하며, 단일 INSERT 쿼리 실행 시에는 설정값과 상관없이 즉시 플러시되어 Part 파일이 생성됩니다.
현재 설정된 min_insert_block_size_rows 값을 확인하려면 system.settings 테이블을 조회하면 됩니다.
select name, value from system.settings where name = 'min_insert_block_size_rows';
Single Insert Query 에서 min_insert_block_size_rows 의 동작.
이제 실제 예시를 통해 min_insert_block_size_rows 설정에 대해 알아보겠습니다.
실습은 Docker 환경에서 진행합니다.
아래의 명령어를 통해서 ClickHouse Docker Container 를 실행합니다.
docker run -d --platform linux/amd64 \ --name clickhouse-server \ clickhouse:24.9.3
아래의 SQL 쿼리들을 통해서 MergeTree Table 을 생성하고 Single Insert Query 를 3회 실행합니다.
CREATE TABLE test_single_insert ( id UInt64, event_type String, timestamp DateTime ) ENGINE = MergeTree() PARTITION BY toYYYYMMDD(timestamp) ORDER BY id; INSERT INTO test_single_insert VALUES (1, 'click', now()); INSERT INTO test_single_insert VALUES (2, 'view', now()); INSERT INTO test_single_insert VALUES (3, 'purchase', now());
참고로 Part 파일들은 /var/lib/clickhouse/data/default/test_single_insert 디렉토리 하위에 생성됩니다.
총 3개의 part 가 생성된 것을 확인할 수 있습니다.
즉, Single Insert Query 에 대해서 개별 쿼리 당 part 가 생성됩니다.
ls -a1 /var/lib/clickhouse/data/default/test_single_insert/
Batch Insert Query 와 min_insert_block_size_rows 의 동작.
min_insert_block_size_rows 설정은 Batch Insert Query 에서 동작되도록 설계되어 있습니다.
Batch Insert Query 의 Rows 수가 min_insert_block_size_rows 보다 작은 경우에는 Single Insert Query 와 마찬가지로 즉시 Flush 되어 Part 가 생성됩니다.
아래는 즉시 Flush 되는 Batch Insert Query 의 예시입니다.
min_insert_block_size_rows 의 설정값이 1,048,449 rows 이기 때문에 1,000,000 의 Rows 를 Insert 하는 예시입니다.
이러한 경우에는 1개의 Part 만이 생성되게 됩니다.
CREATE TABLE test_batch_insert ( id UInt64, event_type String, timestamp DateTime ) ENGINE = MergeTree() PARTITION BY toYYYYMMDD(timestamp) ORDER BY id; INSERT INTO test_batch_insert SELECT number AS id, IF(number % 3 = 0, 'click', IF(number % 3 = 1, 'view', 'purchase')) AS event_type, now() - INTERVAL (number % 10000) SECOND AS created_at FROM numbers(1000000);
이번에는 min_insert_block_size_rows 보다 많은 수의 Rows 를 Insert 해보도록 하겠습니다.
min_insert_block_size_rows 의 10배에 해당하는 10,485,760 만큼 Batch Insert 를 수행하며, 기대하는 Part 의 갯수는 10개입니다.
INSERT INTO test_batch_insert SELECT number AS id, IF(number % 3 = 0, 'click', IF(number % 3 = 1, 'view', 'purchase')) AS event_type, now() - INTERVAL (number % 10000) SECOND AS created_at FROM numbers(10485760);
위 이미지처럼 예상했던 10개의 part가 생성된 것이 아니라, 총 11개의 part 가 생성되었습니다.
그중 20231101_1_6_1 이라는 part는 1번부터 6번까지의 블록(Block) 을 병합(Merge)한 결과로 생성된 새로운 part입니다.
따라서:
- 1번부터 10번까지의 part는 개별적으로 생성되었고,
- Background Merge Compaction 작업을 통해 추가적으로 1개의 병합된 part가 생성된 상태입니다.
결과적으로, 총 11개의 part 가 존재하게 되었습니다.
정리하자면, 매우 큰 Batch Insert Query에서만 min_insert_block_size_rows 설정이 적용되며,
이 설정값에 따라 데이터를 분할하여 part 를 생성합니다.
반응형'Database > Clickhouse' 카테고리의 다른 글
[ClickHouse] remote_servers 설정 알아보기 (0) 2024.06.03 [ClickHouse] Logger 설정하기 (0) 2024.06.02 [ClickHouse] Mutation 알아보기 (0) 2024.04.13 [ClickHouse] Parts & Partition 알아보기 (0) 2024.02.29 [ClickHouse] primary.idx 파일 알아보기 (0) 2024.02.28