INSERT 관련 설정

INSERT 관련 설정

INSERT 작업의 중복 제거, NULL 처리, 샤드 선택, 머티리얼라이즈드 컬럼 허용 등을 제어하는 설정들이에요. 특히 중복 제거 토큰을 활용하면 사용자만의 중복 제거 의미를 정의할 수 있답니다. 이 설정들은 system.settings 테이블에서 확인할 수 있고 소스 코드에서 자동 생성된 값들이에요.

출처: 문서

본문

이 설정들은 system.settings에서 확인할 수 있고, 소스 코드에서 자동 생성된 값들이에요.

insert_allow_materialized_columns

활성화하면 INSERT에서 materialized 컬럼을 허용해요.

insert_deduplicate

INSERT의 블록 중복 제거를 활성화하거나 비활성화해요(Replicated* 테이블용). 이 설정은 deduplicate_insertbackward_compatible_choice로 설정된 경우에만 효과가 있어요.

가능한 값:

  • 0 — 비활성화.
  • 1 — 활성화.

기본적으로 INSERT 문으로 복제 테이블에 삽입된 블록은 중복 제거돼요(Data Replication 참조). 복제 테이블의 경우 기본적으로 각 파티션의 가장 최근 블록 100개만 중복 제거돼요(replicated_deduplication_window, replicated_deduplication_window_seconds 참조). 복제되지 않은 테이블은 non_replicated_deduplication_window를 참조하세요.

insert_deduplication_token

이 설정은 사용자가 MergeTree/ReplicatedMergeTree에서 자신의 중복 제거 의미를 제공할 수 있게 해줘요. 예를 들어 각 INSERT 문장에서 설정에 고유한 값을 제공하면 사용자는 삽입된 동일한 데이터가 중복 제거되는 것을 피할 수 있어요.

가능한 값: 임의의 문자열.

insert_deduplication_token은 비어 있지 않을 때만 중복 제거에 사용돼요. 복제 테이블의 경우 기본적으로 각 파티션의 가장 최근 삽입 100개만 중복 제거돼요(replicated_deduplication_window, replicated_deduplication_window_seconds 참조). 복제되지 않은 테이블은 non_replicated_deduplication_window를 참조하세요.

insert_deduplication_token은 파티션별로 추적되므로 한 삽입으로 쓰여진 여러 파티션이 같은 토큰을 가질 수 있어요. 토큰이 없으면 기본 콘텐츠 체크섬이 전체 삽입된 블록에 대해 계산되므로, 삽입은 전체 데이터가 이전 삽입(재시도)과 일치할 때만 중복 제거되고, 단일 파티션의 행들이 다른 삽입과 우연히 일치할 때는 중복 제거되지 않아요.

예시:

CREATE TABLE test_table
( A Int64 )
ENGINE = MergeTree
ORDER BY A
SETTINGS non_replicated_deduplication_window = 100;

INSERT INTO test_table SETTINGS insert_deduplication_token = 'test' VALUES (1);

-- 다음 삽입은 insert_deduplication_token이 다르므로 중복 제거되지 않습니다
INSERT INTO test_table SETTINGS insert_deduplication_token = 'test1' VALUES (1);

-- 다음 삽입은 insert_deduplication_token이
-- 이전 중 하나와 같으므로 중복 제거됩니다
INSERT INTO test_table SETTINGS insert_deduplication_token = 'test' VALUES (2);

SELECT * FROM test_table

┌─A─┐
│ 1 │
└───┘
┌─A─┐
│ 1 │
└───┘

insert_null_as_default

not nullable 데이터 타입의 컬럼에 NULL 대신 기본값을 삽입하는 것을 활성화하거나 비활성화해요. 컬럼 타입이 nullable이 아니고 이 설정이 비활성화되어 있으면 NULL을 삽입하면 예외가 발생해요. 컬럼 타입이 nullable이면 NULL 값은 이 설정과 무관하게 그대로 삽입돼요.

이 설정은 INSERT … SELECT 쿼리에 적용돼요. SELECT 서브쿼리가 UNION ALL 절로 연결될 수 있다는 점에 유의하세요.

가능한 값:

  • 0 — not nullable 컬럼에 NULL을 삽입하면 예외가 발생해요.
  • 1 — NULL 대신 기본 컬럼 값이 삽입돼요.

insert_shard_id

0이 아니면 데이터가 동기적으로 삽입될 Distributed 테이블의 샤드를 지정해요. insert_shard_id 값이 올바르지 않으면 서버가 예외를 던져요. requested_cluster의 샤드 수를 얻으려면 서버 구성을 확인하거나 다음 쿼리를 사용할 수 있어요:

SELECT uniq(shard_num) FROM system.clusters WHERE cluster = 'requested_cluster';

가능한 값:

  • 0 — 비활성화.
  • 해당 Distributed 테이블의 shards_num까지의 임의의 숫자 1부터.

예시:

쿼리:

CREATE TABLE x AS system.numbers ENGINE = MergeTree ORDER BY number;
CREATE TABLE x_dist AS x ENGINE = Distributed('test_cluster_two_shards_localhost', currentDatabase(), x);
INSERT INTO x_dist SELECT * FROM numbers(5) SETTINGS insert_shard_id = 1;
SELECT * FROM x_dist ORDER BY number ASC;

결과:

┌─number─┐
│      0 │
│      0 │
│      1 │
│      1 │
│      2 │
│      2 │
│      3 │
│      3 │
│      4 │
│      4 │
└────────┘

더 알아보기 (Learn more)