메인 콘텐츠로 건너뛰기
쿼리 조건 캐시는 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는 특정 쿼리 또는 현재 세션의 모든 쿼리에서 쿼리 조건 캐시를 사용할지 여부를 제어합니다. 예를 들어, 다음 쿼리를 처음 실행하면
SELECT col1, col2
FROM table
WHERE col1 = 'x'
SETTINGS use_query_condition_cache = true;
프레디케이트를 만족하지 않는 테이블의 범위를 저장합니다. 이후 동일한 쿼리를 다시 실행할 때도 매개변수 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년 6월 10일