system.predicate_statistics_log 시스템 테이블

system.predicate_statistics_log 시스템 테이블

system.predicate_statistics_logMergeTree 테이블에서 읽을 때 수집된 샘플링된 선택도(selectivity) 통계를 담고 있어요. 이 테이블은 predicate_statistics_sample_rate0 보다 클 때만 채워져요.

출처: 문서

본문

ClickHouse Cloud에서의 조회 — 이 시스템 테이블의 데이터는 ClickHouse Cloud에서 각 노드에 로컬로 저장돼요. 따라서 모든 데이터의 완전한 뷰를 얻으려면 clusterAllReplicas 함수가 필요해요. 자세한 내용은 여기 를 참고하세요.

Description

MergeTree 테이블에서 읽을 때 수집된 샘플링된 선택도 통계를 포함해요. 이 테이블은 predicate_statistics_sample_rate0 보다 클 때만 채워져요.

가용성(Availability) system.predicate_statistics_log 는 서버 구성에 predicate_statistics_log 섹션을 포함하는 경우에만 생성돼요. 로그를 만든 후에는 행을 수집하려면 predicate_statistics_sample_rate0 보다 큰 값으로 설정해요. 로그 섹션이 없으면 테이블에 대한 쿼리는 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_idtable 을 공유하므로, 둘 다 필요할 때 조인할 수 있어요.

샘플링 및 오버헤드

샘플링은 predicate_statistics_sample_rate 로 제어돼요:

  • 0 은 수집을 비활성화해요.

  • 1 은 모든 쿼리를 샘플링해요.

  • N > 1query_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;

See also