メインコンテンツへスキップ
メインコンテンツへスキップ

system.predicate_statistics_log

ClickHouse Cloud でのクエリ実行

このシステムテーブルのデータは、ClickHouse Cloud の各ノードにローカルに格納されています。そのため、すべてのデータを包括的に確認するには、clusterAllReplicas 関数を使用する必要があります。詳細についてはこちらを参照してください。

説明

このテーブルには、MergeTree テーブルの読み込み時に収集されたサンプリング選択性統計が含まれます。このテーブルにデータが格納されるのは、predicate_statistics_sample_rate0 より大きい場合のみです。

このテーブルを使用すると、実際のワークロードにおいてユーザー述語がどの程度絞り込めているか、および主キーまたはスキップ索引によるフィルタリング後に残るグラニュール数を確認できます。このデータは、ワークロードに基づく索引およびプロジェクションの推奨のための入力として使用することを想定しています。

行の形式

1 つのクエリは、system.predicate_statistics_log に 2 種類の行を生成できます。

  • Filter rows: MergeTreeSelectProcessor の各 prewhere/filter ステップごとに出力されます。predicate_expressioninput_rowspassed_rowsfilter_selectivity、および述語全体に対応する total_input_rowstotal_passed_rowstotal_selectivity の各カラムに値が入ります。索引関連のカラムは空です。
  • Index rows: ReadFromMergeTree の各 read ステップごとに出力されます。index_namesindex_typestotal_granulesgranules_afterindex_selectivities の各配列に値が入り、各索引ステージ (主キー、パーティション、スキップ索引) ごとに 1 つのエントリが格納されます。述語関連のカラムは空です。

同じクエリに対応する Filter rows と Index rows は同じ query_idtable を共有するため、両方が必要な場合は結合できます。

サンプリングとオーバーヘッド

サンプリングは predicate_statistics_sample_rate で制御されます。

  • 0 は収集を無効にします。
  • 1 はすべてのクエリをサンプリングします。
  • N > 1 の場合、query_id の hash に基づいて、クエリのおよそ 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))) — 適用された索引の種類: 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;

関連項目