system.predicate_statistics_log
Данные в этой системной таблице хранятся локально на каждом узле в 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) — Идентификатор запроса для связи с 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 (только для строк индекса).