Перейти к основному содержимому
Перейти к основному содержимому

system.predicate_statistics_log

Выполнение запросов в ClickHouse Cloud

Данные в этой системной таблице хранятся локально на каждом узле в ClickHouse Cloud. Поэтому для получения полного обзора всех данных требуется функция clusterAllReplicas. Подробности см. здесь.

Описание

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

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

Структуры строк

Один запрос может порождать два вида строк в 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 — по одному элементу на каждый этап индекса (первичный ключ, партиция, индексы пропуска данных). Столбцы, связанные с предикатами, остаются пустыми.

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

Выборка и накладные расходы

Выборка управляется параметром 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) — Идентификатор запроса для связи с system.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;

См. также