본문으로 바로가기
본문으로 바로가기

system.predicate_statistics_log

ClickHouse Cloud에서 쿼리하기

이 시스템 테이블의 데이터는 ClickHouse Cloud의 각 노드에 로컬로 저장됩니다. 따라서 전체 데이터를 조회하려면 clusterAllReplicas 함수를 사용해야 합니다. 자세한 내용은 여기를 참고하십시오.

설명

MergeTree 테이블을 읽는 동안 수집된 샘플링된 선택도 통계를 포함합니다. 이 테이블은 predicate_statistics_sample_rate0보다 클 때만 데이터가 채워집니다.

이 테이블을 사용하면 실제 워크로드에서 사용자 프레디케이트가 얼마나 선택적인지, 그리고 기본 키 또는 스킵 인덱스 필터링 후 몇 개의 그래뉼이 남는지 확인할 수 있습니다. 이 데이터는 워크로드 기반 인덱스 및 프로젝션 권장 사항을 위한 입력으로 사용됩니다.

행 형태

단일 쿼리는 system.predicate_statistics_log에서 두 종류의 행을 생성할 수 있습니다:

  • 필터 행: MergeTreeSelectProcessor의 각 prewhere/filter 단계마다 기록됩니다. 이 행은 predicate_expression, input_rows, passed_rows, filter_selectivity와 전체 프레디케이트 관련 컬럼인 total_input_rows, total_passed_rows, total_selectivity를 채웁니다. 인덱스 관련 컬럼은 비어 있습니다.
  • 인덱스 행: ReadFromMergeTree의 각 read 단계마다 기록됩니다. 이 행은 index_names, index_types, total_granules, granules_after, index_selectivities 배열을 채우며, 각 인덱스 단계(기본 키(primary key), 파티션, 스킵 인덱스)마다 항목이 하나씩 들어갑니다. 프레디케이트 관련 컬럼은 비어 있습니다.

동일한 쿼리의 필터 행과 인덱스 행은 같은 query_idtable을 공유하므로, 둘 다 필요하면 함께 조인할 수 있습니다.

샘플링과 오버헤드

샘플링은 predicate_statistics_sample_rate로 제어합니다.

  • 0은 수집을 비활성화합니다.
  • 1은 모든 쿼리를 샘플링합니다.
  • N > 1query_id를 기준으로 해시하여 쿼리의 약 1 / N을 샘플링합니다.

값이 낮을수록 더 많은 데이터가 생성되지만, 읽기 경로에서 CPU 작업이 늘어나고 시스템 로그에 대한 쓰기 횟수도 증가합니다. 설정을 활성화한 후 행이 즉시 나타나야 하면 SYSTEM FLUSH LOGS를 사용하십시오.

컬럼

  • hostname (LowCardinality(String)) — 쿼리를 실행하는 서버의 호스트명입니다.
  • event_date (Date) — 이벤트 날짜입니다.
  • event_time (DateTime) — 이 로그 항목이 기록된 타임스탬프입니다.
  • database (LowCardinality(String)) — 대상 테이블이 속한 데이터베이스 이름입니다.
  • table (LowCardinality(String)) — 대상 테이블의 이름입니다.
  • query_id (String) — system.query_log와 연결하기 위한 Query 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_types (Array(LowCardinality(String))) — 적용된 인덱스 타입입니다: PrimaryKey, Skip, MinMax, Partition. 인덱스 행에서만 채워집니다.
  • total_granules (Array(UInt64)) — 각 인덱스 단계로 들어오는 그래뉼 수입니다. 인덱스 행에서만 채워집니다.
  • granules_after (Array(UInt64)) — 각 인덱스 단계 후에 남아 있는 그래뉼 수입니다. 인덱스 행에서만 채워집니다.
  • index_selectivities (Array(Float64)) — 인덱스별 선택도입니다: granules_after / total_granules. 인덱스 행에서만 채워집니다.

예시

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;

관련 항목