메인 콘텐츠로 건너뛰기

기본 키(primary key) 확인하기

기본 키(primary key)를 기준으로 정렬하거나 필터링한다고 생각했는데도 쿼리 속도가 예상보다 느린 경우가 있을 수 있습니다. 이 문서에서는 기본 키가 실제로 사용되는지 확인하는 방법과, 사용되지 않는 일반적인 이유를 설명합니다.

테이블 생성

다음과 같은 간단한 테이블을 예로 들어 보겠습니다:
순서 지정 키의 두 번째 항목에 toUnixTimestamp(timestamp)가 포함되어 있다는 점에 유의하세요.

데이터 채우기

이 테이블을 1억 행으로 채우십시오:

기본 필터링

코드로 필터링하면 출력 결과에서 스캔된 행 수를 확인할 수 있습니다. - 49.15 thousand. 이는 전체 1억 개 행 중 일부에 해당한다는 점에 유의하십시오.
또한 EXPLAIN indexes=1 절로 인덱스가 사용되는지 확인할 수 있습니다:
스캔된 그래뉼 수 8012가 전체 12209 중 일부에 불과하다는 점에 주목하십시오. 아래에 강조 표시된 섹션은 기본 키(primary key) 코드가 사용되었음을 확인해 줍니다.
그래뉼은 ClickHouse에서 데이터를 처리하는 단위이며, 각 그래뉼에는 일반적으로 8192개의 행이 포함됩니다. 그래뉼과 그래뉼이 필터링되는 방식에 대한 자세한 내용은 이 가이드를 참고하시기 바랍니다.
순서 지정 키에서 뒤쪽에 있는 키로 필터링하면 튜플 앞쪽에 있는 키로 필터링하는 경우보다 효율이 떨어집니다. 이유는 여기를 참고하십시오.

여러 키로 필터링하기

codetimestamp를 기준으로 필터링한다고 가정해 보겠습니다.
이 경우 두 순서 지정 키가 모두 행을 필터링하는 데 사용되며, 그 결과 87개의 그래뉼만 읽으면 됩니다.

정렬에서 키 사용하기

ClickHouse는 효율적인 정렬을 위해 순서 지정 키도 활용할 수 있습니다. 구체적으로는 다음과 같습니다. optimize_read_in_order 설정이 활성화되어 있으면(기본값) ClickHouse 서버는 테이블 인덱스를 사용해 ORDER BY 키 순서대로 데이터를 읽습니다. 이렇게 하면 LIMIT가 지정된 경우 모든 데이터를 읽지 않아도 됩니다. 따라서 대규모 데이터에 대해 LIMIT가 작은 쿼리는 더 빠르게 처리됩니다. 자세한 내용은 여기여기를 참조하십시오. 다만 이를 위해서는 사용되는 키가 서로 일치해야 합니다. 예를 들어, 다음 쿼리를 살펴보겠습니다:
EXPLAIN pipeline을 사용하면 여기에서 이 최적화가 적용되지 않았음을 확인할 수 있습니다:
여기서 MergeTreeSelect(pool: ReadPool, algorithm: Thread) 줄은 최적화가 사용되고 있음을 의미하는 것이 아니라, 일반적인 읽기를 의미합니다. 이는 테이블 순서 지정 키에 timestamp가 아니라 toUnixTimestamp(Timestamp)를 사용했기 때문입니다. 이 불일치를 바로잡으면 문제가 해결됩니다:
마지막 수정일 2026년 6월 10일