跳转到主内容
跳转到主内容

system.predicate_statistics_log

在 ClickHouse Cloud 中进行查询

该系统表中的数据保存在 ClickHouse Cloud 中每个节点的本地。因此,如需获得所有数据的完整视图,需要使用 clusterAllReplicas 函数。更多详情请参阅此处

描述

包含从 MergeTree 表读取时收集的采样选择性统计信息。只有当 predicate_statistics_sample_rate 大于 0 时,才会填充此表。

使用此表可查看用户谓词在真实工作负载中的选择性,以及经过主键或跳过索引过滤后还剩余多少粒度。这些数据可作为基于工作负载的索引和投影推荐的输入。

行形态

单个查询可在 system.predicate_statistics_log 中生成两种类型的行:

  • 过滤行:在 MergeTreeSelectProcessor 的每个 prewhere/filter 步骤中生成。它们会填充 predicate_expressioninput_rowspassed_rowsfilter_selectivity,以及整个谓词对应的列 total_input_rowstotal_passed_rowstotal_selectivity。与索引相关的列为空。
  • 索引行:在 ReadFromMergeTree 的每个读取步骤中生成。它们会填充 index_namesindex_typestotal_granulesgranules_afterindex_selectivities 数组,其中每个索引阶段 (主键、分区、跳过索引) 对应一个条目。与谓词相关的列为空。

同一查询的过滤行和索引行共享相同的 query_idtable,因此在同时需要两者时,可以将它们连接起来。

采样与开销

采样由 predicate_statistics_sample_rate 控制:

  • 0 禁用收集。
  • 1 对每个查询都采样。
  • N > 1 时,按 query_id 哈希,对大约 1 / N 的查询进行采样。

较小的值会生成更多数据,但也会增加读取路径上的 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 的查询 ID。
  • 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))) — 已应用的索引类型:PrimaryKeySkipMinMaxPartition。仅索引行会填充此字段。
  • 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;

另请参见