Descrição
Contém estatísticas amostrais de seletividade coletadas durante a leitura de tabelas MergeTree. A tabela é preenchida somente quando predicate_statistics_sample_rate é maior que 0.
Use esta tabela para inspecionar quão seletivos são os predicados definidos pelo usuário em cargas de trabalho reais e quantos grânulos permanecem após a filtragem por chave primária ou índice de salto. Esses dados servem como entrada para recomendações de índices e projeções orientadas pela carga de trabalho.
Estruturas de linha
Uma única consulta pode produzir dois tipos de linhas em system.predicate_statistics_log:
- Linhas de filtro, emitidas por etapa de prewhere/filter em
MergeTreeSelectProcessor. Elas preenchempredicate_expression,input_rows,passed_rows,filter_selectivitye as colunas do predicado completototal_input_rows,total_passed_rowsetotal_selectivity. As colunas relacionadas a índices ficam vazias. - Linhas de índice, emitidas por etapa de leitura em
ReadFromMergeTree. Elas preenchem os arraysindex_names,index_types,total_granules,granules_aftereindex_selectivities, com uma entrada por estágio de índice (chave primária, partição, índice de salto). As colunas relacionadas a predicados ficam vazias.
As linhas de filtro e as linhas de índice da mesma consulta compartilham o mesmo query_id e a mesma table, portanto podem ser combinadas quando ambas forem necessárias.
Amostragem e sobrecarga
A amostragem é controlada por predicate_statistics_sample_rate:
0desativa a coleta.1amostra todas as consultas.N > 1amostra aproximadamente1 / Ndas consultas, com base no hash dequery_id.
Valores menores geram mais dados, mas aumentam o trabalho de CPU no caminho de leitura e o número de gravações nos logs do sistema. Após habilitar a configuração, use SYSTEM FLUSH LOGS se precisar que as linhas apareçam imediatamente.
Colunas
hostname(LowCardinality(String)) — Hostname do servidor que executa a consulta.event_date(Date) — Data do evento.event_time(DateTime) — Timestamp de quando esta entrada de log foi registrada.database(LowCardinality(String)) — Nome do banco de dados da tabela de destino.table(LowCardinality(String)) — Nome da tabela de destino.query_id(String) — ID da consulta para vinculação ao query_log.predicate_expression(String) — Expressão de filtro completa processada por esta etapa de prewhere/filtro (dump do ActionsDAG).input_rows(UInt64) — Linhas que entram nesta etapa de prewhere/filtro.passed_rows(UInt64) — Linhas que passam por esta etapa de prewhere/filtro.filter_selectivity(Float64) — Seletividade desta etapa: passed_rows / input_rows.total_input_rows(UInt64) — Linhas que entram na primeira etapa de prewhere (total de linhas lidas dos grânulos).total_passed_rows(UInt64) — Linhas que passam por todas as etapas de prewhere (linhas entregues à consulta).total_selectivity(Float64) — Seletividade de todo o predicado: total_passed_rows / total_input_rows.index_names(Array(LowCardinality(String))) — Nomes dos índices aplicados, por exemplo ['PrimaryKey', 'idx_bf_status'] (somente linhas de índice).index_types(Array(LowCardinality(String))) — Tipos de índices aplicados: PrimaryKey, Skip, MinMax, Partition (somente linhas de índice).total_granules(Array(UInt64)) — Grânulos que entram em cada estágio de índice (somente linhas de índice).granules_after(Array(UInt64)) — Grânulos restantes após cada estágio de índice (somente linhas de índice).index_selectivities(Array(Float64)) — Seletividade de cada índice: granules_after / total_granules (somente linhas de índice).
Exemplo
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;