説明
MergeTree テーブルの読み取り時に収集された、サンプルベースの選択性統計が含まれます。このテーブルにデータが格納されるのは、predicate_statistics_sample_rate が 0 より大きい場合のみです。
このテーブルを使用すると、実際のワークロードにおいてユーザー述語がどの程度の選択性を持つか、またプライマリキーまたはスキップ索引によるフィルタリング後にどれだけのグラニュールが残るかを確認できます。このデータは、ワークロードに基づく索引およびプロジェクションの推奨を行うための入力として利用されます。
行の構造
1 つのクエリは、system.predicate_statistics_log に 2 種類の行を生成できます。
- フィルタ行:
MergeTreeSelectProcessorの各 prewhere/filter ステップごとに出力されます。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の各配列が設定され、各索引ステージ (主キー、パーティション、スキップ索引) ごとに 1 つのエントリが入ります。述語関連のカラムは空です。
同じクエリのフィルタ行と索引行は同じ query_id と table を共有するため、両方が必要な場合は結合できます。
サンプリングとオーバーヘッド
サンプリングは 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) — 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;