Описание
Содержит статистику селективности по выборке, собранную при чтении из таблиц 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;