쿼리 조건 캐시는 enable_analyzer가 true로 설정된 경우에만 동작하며, 이는 기본값입니다.
WHERE col = 'xyz')을 평가하면 언제나 같은 결과가 나온다는 아이디어에 기반합니다.
더 구체적으로 말하면, 쿼리 조건 캐시는 평가된 각 필터와 각 그래뉼(기본적으로 8192개 행으로 이루어진 블록)마다 해당 그래뉼에 필터 조건을 만족하는 행이 없는지를 기억합니다.
이 정보는 단일 비트로 기록됩니다. 0비트는 필터와 일치하는 행이 없음을 나타내고, 1비트는 일치하는 행이 하나 이상 있음을 의미합니다.
전자의 경우 ClickHouse는 필터 평가 중 해당 그래뉼을 건너뛸 수 있고, 후자의 경우 그래뉼을 로드해 평가해야 합니다.
다음 세 가지 전제 조건이 충족되면 쿼리 조건 캐시는 효과적입니다.
- 첫째, 워크로드에서 동일한 필터 조건을 반복적으로 평가해야 합니다. 이는 하나의 쿼리를 여러 번 반복할 때 자연스럽게 발생하지만, 두 쿼리가 동일한 필터를 공유하는 경우에도 발생할 수 있습니다. 예를 들어
SELECT product FROM products WHERE quality > 3와SELECT vendor, count() FROM products WHERE quality > 3가 있습니다. - 둘째, 데이터의 대부분이 불변이어야 합니다. 즉, 쿼리 사이에 변경되지 않아야 합니다. 이는 ClickHouse에서 일반적으로 성립하는데, 파트는 불변이며 INSERT에 의해서만 생성되기 때문입니다.
- 셋째, 필터의 선택도가 높아야 합니다. 즉, 필터 조건을 만족하는 행이 상대적으로 적어야 합니다. 필터 조건과 일치하는 행이 적을수록 더 많은 그래뉼이 0비트(일치하는 행 없음)로 기록되며, 이후 필터 평가에서 더 많은 데이터를 “가지치기”할 수 있습니다.
메모리 사용량
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 = true를 사용하면 쿼리 조건 캐시를 활용해 스캔하는 데이터를 줄일 수 있습니다.
관리
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_cache의 condition 필드를 확인할 수 있습니다. 이 필드는 디버그 빌드에서만 사용할 수 있습니다.
데이터베이스 시작 이후의 쿼리 조건 캐시 적중 수와 미스 수는 시스템 테이블(system table) system.events의 “QueryConditionCacheHits” 및 “QueryConditionCacheMisses” 이벤트에 표시됩니다.
두 카운터는 use_query_condition_cache = true 설정으로 실행되는 SELECT 쿼리에 대해서만 업데이트되며, 다른 쿼리는 “QueryCacheMisses”에 영향을 주지 않습니다.