system.predicate_statistics_log 시스템 테이블
system.predicate_statistics_log 시스템 테이블
system.predicate_statistics_log 는 MergeTree 테이블에서 읽을 때 수집된 샘플링된 선택도(selectivity) 통계를 담고 있어요. 이 테이블은 predicate_statistics_sample_rate 가 0 보다 클 때만 채워져요.
출처: 문서
본문
ClickHouse Cloud에서의 조회 — 이 시스템 테이블의 데이터는 ClickHouse Cloud에서 각 노드에 로컬로 저장돼요. 따라서 모든 데이터의 완전한 뷰를 얻으려면 clusterAllReplicas 함수가 필요해요. 자세한 내용은 여기 를 참고하세요.
Description
MergeTree 테이블에서 읽을 때 수집된 샘플링된 선택도 통계를 포함해요. 이 테이블은 predicate_statistics_sample_rate 가 0 보다 클 때만 채워져요.
가용성(Availability)
system.predicate_statistics_log 는 서버 구성에 predicate_statistics_log 섹션을 포함하는 경우에만 생성돼요. 로그를 만든 후에는 행을 수집하려면 predicate_statistics_sample_rate 를 0 보다 큰 값으로 설정해요. 로그 섹션이 없으면 테이블에 대한 쿼리는 UNKNOWN_TABLE 오류로 실패해요.
system
predicate_statistics_log
toYYYYMM(event_date)
7500
이 테이블을 사용하여 실제 워크로드에서 사용자 프레디킷(조건)이 얼마나 선택적인지, 그리고 기본 키 또는 스킵 인덱스 필터링 후 남는 그래뉼이 얼마나 되는지 검사할 수 있어요. 이 데이터는 워크로드 기반 인덱스와 프로젝션 권장 사항의 입력으로 사용하기 위한 것이에요.
행 형태(Row shapes)
단일 쿼리는 system.predicate_statistics_log 에서 두 종류의 행을 만들 수 있어요:
-
Filter 행 —
MergeTreeSelectProcessor의 prewhere/filter 단계마다 하나씩 생성돼요.predicate_expression,input_rows,passed_rows,filter_selectivity, 그리고 전체 프레디킷 열인total_input_rows,total_passed_rows,total_selectivity를 채워요. 인덱스 관련 열은 비어 있어요. -
Index 행 —
ReadFromMergeTree의 읽기 단계마다 하나씩 생성돼요.index_names,index_types,total_granules,granules_after,index_selectivities배열을 채우며, 인덱스 단계(기본 키, 파티션, 스킵 인덱스)마다 하나의 항목이 있어요. 프레디킷 관련 열은 비어 있어요.
같은 쿼리의 Filter 행과 Index 행은 같은 query_id 와 table 을 공유하므로, 둘 다 필요할 때 조인할 수 있어요.
샘플링 및 오버헤드
샘플링은 predicate_statistics_sample_rate 로 제어돼요:
-
0은 수집을 비활성화해요. -
1은 모든 쿼리를 샘플링해요. -
N > 1은query_id로 해시하여 대략1 / N의 쿼리를 샘플링해요.
더 낮은 값은 더 많은 데이터를 생성하지만 읽기 경로에 CPU 작업을 더하고 시스템 로그에 더 많은 쓰기를 발생시켜요. 설정을 활성화한 후 행이 즉시 나타나기를 원하면 SYSTEM FLUSH LOGS 를 사용해요.
이 테이블은 언제든지 안전하게 truncate 하거나 drop 할 수 있어요.
Columns
-
hostname(LowCardinality(String)) — 쿼리를 실행한 서버의 호스트 이름이에요. -
clickhouse_version(LowCardinality(String)) — 이 행을 만든 ClickHouse 서버의 버전이에요. -
system_processor(LowCardinality(String)) — 이 행을 만든 ClickHouse 서버의 CPU 아키텍처예요. -
event_date(Date) — 이벤트 날짜예요. -
event_time(DateTime) — 이 로그 항목이 쓰인 타임스탬프예요. -
database(LowCardinality(String)) — 대상 테이블의 데이터베이스 이름이에요. -
table(LowCardinality(String)) — 대상 테이블의 테이블 이름이에요. -
query_id(String) — query_log 로 연결하기 위한 쿼리 ID예요. -
predicate_expression(String) — 이 prewhere/filter 단계가 처리한 전체 필터 표현식이에요(ActionsDAG 덤프). -
input_rows(UInt64) — 이 prewhere/filter 단계로 들어오는 행 수예요. -
passed_rows(UInt64) — 이 prewhere/filter 단계를 통과한 행 수예요. -
filter_selectivity(Float64) — 이 단계의 선택도예요: passed_rows / input_rows. -
total_input_rows(UInt64) — 첫 번째 prewhere 단계로 들어오는 행 수예요(그래뉼에서 읽은 총 행). -
total_passed_rows(UInt64) — 모든 prewhere 단계를 통과한 행 수예요(쿼리로 전달된 행). -
total_selectivity(Float64) — 전체 프레디킷의 선택도예요: total_passed_rows / total_input_rows. -
index_names(Array(LowCardinality(String))) — 적용된 인덱스의 이름이에요. 예: [‘PrimaryKey’, ‘idx_bf_status’] (index 행만 해당). -
index_types(Array(LowCardinality(String))) — 적용된 인덱스의 유형이에요: PrimaryKey, Skip, MinMax, Partition (index 행만 해당). -
total_granules(Array(UInt64)) — 각 인덱스 단계로 들어오는 그래뉼이에요 (index 행만 해당). -
granules_after(Array(UInt64)) — 각 인덱스 단계 후 남는 그래뉼이에요 (index 행만 해당). -
index_selectivities(Array(Float64)) — 인덱스별 선택도예요: granules_after / total_granules (index 행만 해당).
Example
SET predicate_statistics_sample_rate = 1;
SELECT *
FROM hits
WHERE URL LIKE '%/product/%' AND EventDate >= today() - 7
FORMAT Null;
SYSTEM FLUSH LOGS predicate_statistics_log;
SELECT
query_id,
predicate_expression,
round(filter_selectivity, 3) AS step_selectivity,
round(total_selectivity, 3) AS query_selectivity,
index_names,
index_selectivities
FROM system.predicate_statistics_log
WHERE table = 'hits'
ORDER BY event_time DESC
LIMIT 10;