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) — Идентификатор запроса для связи с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. Заполняется только для строк индекса.