system.predicate_statistics_log
ClickHouse Cloud에서 쿼리하기
이 시스템 테이블의 데이터는 ClickHouse Cloud의 각 노드에 로컬로 저장됩니다. 따라서 전체 데이터를 조회하려면 clusterAllReplicas 함수를 사용해야 합니다. 자세한 내용은 여기를 참고하십시오.
설명
MergeTree 테이블을 읽는 동안 수집된 샘플링된 선택도 통계를 포함합니다. 이 테이블은 predicate_statistics_sample_rate가 0보다 클 때만 데이터가 채워집니다.
이 테이블을 사용하면 실제 워크로드에서 사용자 프레디케이트가 얼마나 선택적인지, 그리고 기본 키 또는 스킵 인덱스 필터링 후 몇 개의 그래뉼이 남는지 확인할 수 있습니다. 이 데이터는 워크로드 기반 인덱스 및 프로젝션 권장 사항을 위한 입력으로 사용됩니다.
행 형태
단일 쿼리는 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_id와 table을 공유하므로, 둘 다 필요하면 함께 조인할 수 있습니다.
샘플링과 오버헤드
샘플링은 predicate_statistics_sample_rate로 제어합니다.
0은 수집을 비활성화합니다.1은 모든 쿼리를 샘플링합니다.N > 1은query_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. 인덱스 행에서만 채워집니다.