메인 콘텐츠로 건너뛰기
쿼리 조건 캐시는 enable_analyzer가 true로 설정된 경우에만 동작하며, 이는 기본값입니다.
실제 워크로드에서는 동일하거나 거의 동일한 데이터(예: 기존 데이터에 새 데이터만 추가된 경우)에 대해 반복적으로 쿼리를 수행하는 일이 많습니다. ClickHouse는 이러한 쿼리 패턴에 대응할 수 있도록 다양한 최적화 기법을 제공합니다. 한 가지 방법은 인덱스 구조(예: 프라이머리 키 인덱스(primary key indexes), 스키핑 인덱스(skipping indexes), 프로젝션)나 사전 계산(구체화된 뷰(Materialized View))을 사용해 물리적 데이터 레이아웃을 조정하는 것입니다. 또 다른 방법은 반복적인 쿼리 평가를 피하기 위해 ClickHouse의 쿼리 캐시를 사용하는 것입니다. 첫 번째 접근 방식의 단점은 데이터베이스 관리자의 수동 개입과 모니터링이 필요하다는 점입니다. 두 번째 접근 방식은 오래된 결과를 반환할 수 있다는 점이 단점입니다(쿼리 캐시는 트랜잭션 일관성이 없기 때문). 이 점이 허용 가능한지는 사용 사례에 따라 달라집니다. 쿼리 조건 캐시는 이 두 가지 문제를 모두 우아하게 해결합니다. 이 기능은 동일한 데이터에 대해 필터 조건(예: WHERE col = 'xyz')을 평가하면 언제나 같은 결과가 나온다는 아이디어에 기반합니다. 더 구체적으로 말하면, 쿼리 조건 캐시는 평가된 각 필터와 각 그래뉼(기본적으로 8192개 행으로 이루어진 블록)마다 해당 그래뉼에 필터 조건을 만족하는 행이 없는지를 기억합니다. 이 정보는 단일 비트로 기록됩니다. 0비트는 필터와 일치하는 행이 없음을 나타내고, 1비트는 일치하는 행이 하나 이상 있음을 의미합니다. 전자의 경우 ClickHouse는 필터 평가 중 해당 그래뉼을 건너뛸 수 있고, 후자의 경우 그래뉼을 로드해 평가해야 합니다. 다음 세 가지 전제 조건이 충족되면 쿼리 조건 캐시는 효과적입니다.
  • 첫째, 워크로드에서 동일한 필터 조건을 반복적으로 평가해야 합니다. 이는 하나의 쿼리를 여러 번 반복할 때 자연스럽게 발생하지만, 두 쿼리가 동일한 필터를 공유하는 경우에도 발생할 수 있습니다. 예를 들어 SELECT product FROM products WHERE quality > 3SELECT vendor, count() FROM products WHERE quality > 3 가 있습니다.
  • 둘째, 데이터의 대부분이 불변이어야 합니다. 즉, 쿼리 사이에 변경되지 않아야 합니다. 이는 ClickHouse에서 일반적으로 성립하는데, 파트는 불변이며 INSERT에 의해서만 생성되기 때문입니다.
  • 셋째, 필터의 선택도가 높아야 합니다. 즉, 필터 조건을 만족하는 행이 상대적으로 적어야 합니다. 필터 조건과 일치하는 행이 적을수록 더 많은 그래뉼이 0비트(일치하는 행 없음)로 기록되며, 이후 필터 평가에서 더 많은 데이터를 “가지치기”할 수 있습니다.

메모리 사용량

쿼리 조건 캐시는 필터 조건과 그래뉼마다 1비트만 저장하므로 메모리를 거의 사용하지 않습니다. 쿼리 조건 캐시의 최대 크기는 서버 설정 query_condition_cache_size로 설정할 수 있습니다(기본값: 100 MB). 캐시 크기 100 MB는 100 * 1024 * 1024 * 8 = 838,860,800개의 항목에 해당합니다. 각 항목은 mark 1개를 나타내며(기본적으로 8192행), 캐시는 단일 컬럼 기준으로 최대 6,871,947,673,600(6.8조)행까지 포괄할 수 있습니다. 실제 환경에서는 필터가 둘 이상의 컬럼에서 평가되므로 이 수치는 필터링되는 컬럼 수로 나누어야 합니다.

구성 설정 및 사용

설정 use_query_condition_cache는 특정 쿼리 또는 현재 세션의 모든 쿼리에서 쿼리 조건 캐시를 사용할지 여부를 제어합니다. 예를 들어, 다음 쿼리를 처음 실행하면
프레디케이트를 만족하지 않는 테이블의 범위를 저장합니다. 이후 동일한 쿼리를 다시 실행할 때도 매개변수 use_query_condition_cache = true를 사용하면 쿼리 조건 캐시를 활용해 스캔하는 데이터를 줄일 수 있습니다.

관리

쿼리 조건 캐시는 ClickHouse를 다시 시작해도 유지되지 않습니다. 쿼리 조건 캐시를 비우려면 SYSTEM CLEAR QUERY CONDITION CACHE를 실행하세요. 캐시 내용은 시스템 테이블(system table) system.query_condition_cache에 표시됩니다. 현재 쿼리 조건 캐시의 크기를 MB 단위로 계산하려면 SELECT formatReadableSize(sum(entry_size)) FROM system.query_condition_cache를 실행하세요. 개별 필터 조건을 조사하려면 system.query_condition_cachecondition 필드를 확인할 수 있습니다. 이 필드는 디버그 빌드에서만 사용할 수 있습니다. 데이터베이스 시작 이후의 쿼리 조건 캐시 적중 수와 미스 수는 시스템 테이블(system table) system.events의 “QueryConditionCacheHits” 및 “QueryConditionCacheMisses” 이벤트에 표시됩니다. 두 카운터는 use_query_condition_cache = true 설정으로 실행되는 SELECT 쿼리에 대해서만 업데이트되며, 다른 쿼리는 “QueryCacheMisses”에 영향을 주지 않습니다.
마지막 수정일 2026년 7월 3일