제한 사항
불확실한 삽입 상태
중복 제거 윈도우 제한
*_deduplication_window를 초과해 발생하면 중복 제거가 의도대로 작동하지 않을 수 있습니다. 이 경우 동일한 데이터가 여러 번 삽입될 수 있습니다.
재시도 시 삽입 중복 제거 활성화
테이블의 삽입 중복 제거
*MergeTree 엔진에서만 지원됩니다.
*ReplicatedMergeTree 엔진에서는 삽입 중복 제거가 기본적으로 활성화되어 있으며, replicated_deduplication_window 및 replicated_deduplication_window_seconds 설정으로 제어됩니다. 복제되지 않은 *MergeTree 엔진에서는 중복 제거가 non_replicated_deduplication_window 설정으로 제어됩니다.
위 설정은 테이블의 중복 제거 로그에 대한 매개변수를 결정합니다. 중복 제거 로그에는 제한된 개수의 block_id가 저장되며, 이 값이 중복 제거 동작 방식을 결정합니다(아래 참조).
쿼리 수준 삽입 중복 제거
insert_deduplicate=1을 사용하면 쿼리 수준의 중복 제거가 활성화됩니다. insert_deduplicate=0으로 데이터를 삽입한 경우, 이후 insert_deduplicate=1로 삽입을 다시 시도하더라도 해당 데이터는 중복 제거되지 않습니다. 이는 insert_deduplicate=0으로 삽입할 때는 각 블록에 대한 block_id가 기록되지 않기 때문입니다.
삽입 중복 제거의 작동 방식
*MergeTree 엔진을 사용하는 테이블에서는 각 블록에 해당 블록 데이터의 해시값인 고유한 block_id가 할당됩니다. 이 block_id는 삽입 작업의 고유 키로 사용됩니다. 중복 제거 로그에서 동일한 block_id가 발견되면 해당 블록은 중복으로 간주되며 테이블에 삽입되지 않습니다.
이 방식은 삽입마다 서로 다른 데이터가 포함되는 경우에 효과적입니다. 하지만 동일한 데이터를 의도적으로 여러 번 삽입해야 하는 경우에는 중복 제거 과정을 제어하기 위해 insert_deduplication_token 설정을 사용해야 합니다. 이 설정을 사용하면 각 삽입에 대해 고유한 토큰을 지정할 수 있으며, ClickHouse는 이를 기준으로 데이터가 중복인지 판단합니다.
INSERT ... VALUES 쿼리의 경우, 삽입된 데이터를 블록으로 나누는 방식은 결정적이며 설정값에 따라 정해집니다. 따라서 삽입을 재시도할 때는 최초 작업과 동일한 설정값을 사용해야 합니다.
INSERT ... SELECT 쿼리의 경우에는 쿼리의 SELECT 부분이 매 작업마다 동일한 순서로 동일한 데이터를 반환하는 것이 중요합니다. 다만 실제로는 이를 달성하기가 어렵습니다. 재시도 시 데이터 순서를 안정적으로 유지하려면 쿼리의 SELECT 부분에 ORDER BY ALL 절을 정의하십시오. 현재는 쿼리에서 반드시 정확히 ORDER BY ALL을 사용해야 합니다. ORDER BY 지원은 아직 구현되지 않았으므로, 쿼리의 SELECT 부분은 안정적인 것으로 간주되지 않습니다. 또한 재시도 사이에 선택 대상 테이블이 업데이트될 수 있다는 점도 유의해야 합니다. 이 경우 결과 데이터가 변경되어 중복 제거가 수행되지 않을 수 있습니다. 또한 대량의 데이터를 삽입하는 경우에는 삽입 후 생성되는 블록 수가 중복 제거 로그 윈도우를 초과할 수 있으며, 이 경우 ClickHouse가 해당 블록을 중복 제거해야 하는지 판단하지 못할 수 있습니다.
현재 INSERT ... SELECT의 동작은 insert_select_deduplicate 설정으로 제어됩니다. 이 설정은 INSERT ... SELECT 쿼리로 삽입된 데이터에 중복 제거를 적용할지 여부를 결정합니다. 자세한 내용과 사용 예시는 링크된 문서를 참조하십시오.
materialized view에서의 삽입 중복 제거
replicated_deduplication_windowreplicated_deduplication_window_secondsnon_replicated_deduplication_window
deduplicate_blocks_in_dependent_materialized_views도 활성화해야 합니다.
insert_deduplicate=1을 활성화하면 삽입된 데이터가 소스 테이블에서 중복 제거됩니다. deduplicate_blocks_in_dependent_materialized_views=1 설정을 사용하면 종속 테이블에서도 추가로 중복 제거가 활성화됩니다. 전체 중복 제거가 필요하면 두 설정을 모두 활성화해야 합니다.
materialized view의 대상 테이블에 블록을 삽입할 때 ClickHouse는 소스 테이블의 block_id와 추가 식별자를 결합한 문자열을 해시하여 block_id를 계산합니다. 이를 통해 materialized view 내에서 정확한 중복 제거가 보장되며, materialized view의 대상 테이블에 도달하기 전에 어떤 변환이 적용되었는지와 관계없이 원래 삽입된 기준에 따라 데이터를 구분할 수 있습니다.
예시
materialized view 변환 후 동일한 블록
dst 테이블에 2개의 파트가 삽입된 것을 확인할 수 있습니다. select에서 가져온 2개의 블록 — 삽입 시 2개의 파트입니다. 이 파트들은 서로 다른 데이터를 포함하고 있습니다.
mv_dst 테이블에 2개의 파트가 삽입된 것을 확인할 수 있습니다. 이 파트들은 동일한 데이터를 포함하지만, 중복 제거되지는 않습니다.
dst 테이블과 mv_dst 테이블 모두에 적용됩니다.
삽입 시 동일 블록
dst에 삽입할 블록도 두 개여야 합니다. 그러나 실제로는 table dst에 하나의 블록만 삽입된 것을 확인할 수 있습니다. 이는 두 번째 블록이 중복 제거되었기 때문입니다. 이 블록은 데이터가 동일하고, 삽입된 데이터에서 hash로 계산되는 중복 제거 키 block_id도 같습니다. 이러한 동작은 예상한 결과가 아닙니다. 이런 경우는 드물지만 이론적으로는 발생할 수 있습니다. 이러한 경우를 올바르게 처리하려면 사용자가 insert_deduplication_token을 제공해야 합니다. 다음 예시에서 이를 수정해 보겠습니다:
insert_deduplication_token을 사용한 삽입 중 동일한 블록
insert_deduplication_token의 우선순위가 더 높다는 점에 유의하십시오. insert_deduplication_token이 제공되면 ClickHouse는 데이터의 해시값을 사용하지 않습니다.
materialized view의 기반 테이블에서 변환 후 동일한 데이터를 생성하는 여러 삽입 작업
mv_dst 테이블(table)에는 동일한 데이터가 삽입됩니다. 소스 데이터가 서로 달랐기 때문에 데이터는 중복 제거되지 않습니다.
동등한 데이터를 하나의 기반 테이블에 삽입하는 여러 materialized view
mv_dst에 삽입되었습니다.
dst와 mv_dst 두 테이블(table) 모두에서 중복 제거 처리됩니다.