Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

system.predicate_statistics_log

Описание

Содержит статистику селективности по выборке, собранную при чтении из таблиц MergeTree. Таблица заполняется только тогда, когда predicate_statistics_sample_rate больше 0.

Используйте эту таблицу, чтобы оценить, насколько селективны пользовательские предикаты в реальных рабочих нагрузках и сколько гранул остается после фильтрации по primary key или индексу пропуска данных. Эти данные предназначены для выработки рекомендаций по индексам и проекциям на основе рабочих нагрузок.

Виды строк

Один запрос может порождать два вида строк в system.predicate_statistics_log:

  • Строки фильтров, создаваемые на каждом шаге prewhere/filter в MergeTreeSelectProcessor. В них заполняются predicate_expression, input_rows, passed_rows, filter_selectivity, а также столбцы, относящиеся ко всему предикату: total_input_rows, total_passed_rows, total_selectivity. Столбцы, связанные с индексами, остаются пустыми.
  • Строки индексов, создаваемые на каждом шаге чтения в ReadFromMergeTree. В них заполняются массивы index_names, index_types, total_granules, granules_after и index_selectivities — по одной записи на каждый этап индексации (primary key, партиция, индекс пропуска данных). Столбцы, связанные с предикатами, остаются пустыми.

Строки фильтров и строки индексов для одного и того же запроса имеют одинаковые query_id и table, поэтому при необходимости их можно объединить с помощью JOIN.

Сэмплирование и накладные расходы

Сэмплирование управляется параметром predicate_statistics_sample_rate:

  • 0 отключает сбор.
  • 1 включает сэмплирование каждого запроса.
  • N > 1 включает сэмплирование примерно 1 / N запросов по хешу query_id.

Меньшие значения дают больше данных, но увеличивают нагрузку на CPU при чтении и число записей в системном журнале. После включения этой настройки используйте SYSTEM FLUSH LOGS, если нужно, чтобы строки появились сразу.

Столбцы

  • hostname (LowCardinality(String)) — Имя хоста сервера, выполняющего запрос.
  • event_date (Date) — Дата события.
  • event_time (DateTime) — Временная метка, когда была сделана эта запись в журнале.
  • database (LowCardinality(String)) — Имя базы данных целевой таблицы.
  • table (LowCardinality(String)) — Имя целевой таблицы.
  • query_id (String) — Идентификатор запроса для связи с query_log.
  • 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;

См. также

Navigation