대부분의 경우 파티션 키는 필요하지 않으며, 그 외의 대부분의 경우에도 월 단위보다 더 세분화된 파티션 키는 필요하지 않습니다. 단, 일 단위 파티셔닝이 일반적인 관측성 사용 사례는 예외입니다.지나치게 세분화된 파티셔닝은 절대 사용하지 마십시오. 클라이언트 식별자나 이름을 기준으로 데이터를 파티셔닝하지 마십시오. 대신 클라이언트 식별자 또는 이름을 ORDER BY 표현식의 첫 번째 컬럼으로 사용하십시오.
PARTITION BY expr 절에서 지정합니다. 파티션 키는 테이블 컬럼을 기반으로 하는 임의의 표현식이 될 수 있습니다. 예를 들어 월별 파티셔닝을 지정하려면 toYYYYMM(date_column) 표현식을 사용합니다:
머지 작업은 파티셔닝 표현식의 값이 같은 데이터 파트에서만 수행됩니다. 즉, 파티션을 지나치게 세분화하지 말아야 합니다(약 1,000개를 초과하는 파티션). 그렇지 않으면 파일 시스템의 파일 수와 열린 파일 디스크립터 수가 지나치게 많아져
SELECT 쿼리 성능이 저하됩니다.visits 테이블이 있다고 가정하겠습니다. system.parts 테이블에 대해 SELECT 쿼리를 실행해 보겠습니다:
partition 컬럼에는 파티션 이름이 들어 있습니다. 이 예시에는 201901과 201902라는 2개의 파티션이 있습니다. 이 컬럼 값을 사용하면 ALTER … PARTITION 쿼리에서 파티션 이름을 지정할 수 있습니다.
name 컬럼에는 파티션 데이터 파트의 이름이 들어 있습니다. 이 컬럼을 사용하면 ALTER ATTACH PART 쿼리에서 파트 이름을 지정할 수 있습니다.
파트 이름 201901_1_9_2_11을 분해해 보겠습니다:
201901은 파티션 이름입니다.1은 데이터 블록의 최소 번호입니다.9는 데이터 블록의 최대 번호입니다.2는 청크 수준(이 파트가 형성된 머지 트리의 깊이)입니다.11은 mutation 버전입니다(파트에 mutation이 적용된 경우).
구형 테이블의 파트 이름은
20190117_20190123_2_2_0 형식입니다(최소 날짜 - 최대 날짜 - 최소 블록 번호 - 최대 블록 번호 - 수준).active 컬럼은 파트의 상태를 보여줍니다. 1은 활성 상태이고 0은 비활성 상태입니다. 비활성 파트에는 예를 들어 더 큰 파트로 머지된 후 남아 있는 원본 파트가 포함됩니다. 손상된 데이터 파트도 비활성으로 표시됩니다.
예시에서 볼 수 있듯이 동일한 파티션에 분리된 여러 파트가 있습니다(예: 201901_1_3_1 및 201901_1_9_2). 이는 이러한 파트가 아직 머지되지 않았다는 의미입니다. ClickHouse는 삽입된 데이터 파트를 주기적으로 머지하며, 일반적으로 삽입 후 약 15분 뒤에 수행됩니다. 또한 OPTIMIZE 쿼리를 사용해 예약되지 않은 머지를 수행할 수 있습니다. 예시:
/var/lib/clickhouse/data/<database>/<table>/)로 이동하는 것입니다. 예시:
detached 디렉터리에는 DETACH 쿼리를 사용해 테이블에서 분리된 파트가 들어 있습니다. 손상된 파트도 삭제되지 않고 이 디렉터리로 이동됩니다. 서버는 detached 디렉터리에 있는 파트를 사용하지 않습니다. 이 디렉터리의 데이터는 언제든지 추가, 삭제 또는 수정할 수 있지만, ATTACH 쿼리를 실행하기 전까지는 서버가 이를 인지하지 못합니다.
운영 중인 서버에서는 파일 시스템에서 파트 집합이나 그 데이터를 수동으로 변경할 수 없습니다. 서버가 이를 인지하지 못하기 때문입니다. 복제되지 않은 테이블의 경우 서버가 중지된 상태에서는 이렇게 할 수 있지만, 권장되지는 않습니다. 복제된 테이블의 경우에는 어떤 상황에서도 파트 집합을 변경할 수 없습니다.
ClickHouse에서는 파티션에 대해 삭제하거나, 한 테이블에서 다른 테이블로 복사하거나, 백업을 생성하는 등의 작업을 수행할 수 있습니다. 모든 작업 목록은 Manipulations With Partitions and Parts 섹션을 참조하십시오.
파티션 키를 사용한 Group By 최적화
이러한 쿼리의 성능은 테이블 레이아웃에 따라 달라집니다. 이 최적화는 버전 26.7부터 기본적으로 활성화되며, 런타임 휴리스틱은 파티션 레이아웃이 불리하면 이를 자동으로 건너뜁니다. 구체적으로는 파티션이 너무 적은 경우(
max_threads / 2보다 적음), 파티션이 너무 많은 경우(max_number_of_partitions_for_independent_aggregation보다 많음), 또는 파티션 크기 편차가 매우 큰 경우(가장 큰 파티션의 행 수가 전체 행 수를 max_threads로 나눈 값의 두 배보다 큼)입니다. 아래 목록은 일반적으로 좋은 성능을 위한 레이아웃 요소를 설명하며, 이 중 런타임 휴리스틱으로 실제 적용되는 것은 파티션 수와 크기 편차뿐입니다.- 쿼리에 포함되는 파티션 수가 충분히 많아야 합니다 (
max_threads / 2보다 커야 함). 그렇지 않으면 쿼리가 시스템 자원을 충분히 활용하지 못합니다. - 파티션이 너무 작아서는 안 됩니다. 그렇지 않으면 배치 처리가 행 단위 처리로 전락할 수 있습니다.
- 파티션 크기가 서로 비슷해야 모든 스레드가 대체로 같은 양의 작업을 처리합니다.
데이터를 파티션 간에 고르게 분산하려면
partition by 절의 컬럼에 해시 함수를 적용하는 것이 좋습니다.allow_aggregate_partitions_independently- 이 최적화 사용 여부를 제어합니다.force_aggregate_partitions_independently- 정확성 측면에서 적용 가능하지만, 효율성을 추정하는 내부 로직에 의해 비활성화되는 경우에도 강제로 사용합니다.max_number_of_partitions_for_independent_aggregation- 테이블이 가질 수 있는 최대 파티션 수에 대한 하드 제한입니다.