在處理大規模資料聚合查詢時,ClickHouse 除了靠 Partition Pruning、Data Skipping Index 來加速查詢(忘了再回去複習),還有一個極具威力的查詢優化武器 — Projections。
Projections 能夠透過預先排序、聚合或重組資料結構,讓查詢執行路徑變得更短、更快。
Projection 是一種儲存在 Table Parts 內部的物化結構 (Internal Materialized View),會針對特定查詢場景提前建立排序或聚合結果。
特性 | 說明 |
---|---|
屬於 Table 的一部分 | Projection 資料與 Table 共存在同一個資料片段 (Part)。 |
查詢時自動命中 | 不需修改查詢語法,ClickHouse 會自動選擇最小掃描量的 Projection。 |
可建立多個 Projection | 針對不同查詢需求定義不同 Projections。 |
CREATE TABLE user_events
(
EventDate Date,
UserID UInt64,
Action String,
Version UInt32
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(EventDate)
ORDER BY (UserID, EventDate)
SETTINGS index_granularity = 8192
AS
SELECT * FROM source_table;
ALTER TABLE user_events
ADD PROJECTION daily_user_action_counts
(
SELECT
EventDate,
Action,
count() AS ActionCount
GROUP BY
EventDate,
Action
);
執行 OPTIMIZE TABLE user_events FINAL
後,ClickHouse 會在背景將 Projection 資料寫入 table parts 中。
只要查詢符合 Projection 結構,ClickHouse 會自動使用 Projection 來加速查詢:
SELECT EventDate, Action, count()
FROM user_events
WHERE EventDate = '2025-08-10'
GROUP BY EventDate, Action;
透過 EXPLAIN PLAN 可以看到查詢使用的是 Projection:
EXPLAIN PLAN SELECT EventDate, Action, count() FROM user_events WHERE EventDate = '2025-08-10' GROUP BY EventDate, Action;
Projection: daily_user_action_counts
ReadFromMergeTree (using projection)
假設 user_events 有 10 億筆資料,執行以下查詢:
SELECT EventDate, Action, count()
FROM user_events
WHERE EventDate >= '2025-08-01'
GROUP BY EventDate, Action;
這種場景特別適合 BI 報表、Dashboard 上的高頻聚合查詢。
限制項目 | 說明 |
---|---|
Projection 設計需事先規劃 | Projection 一旦定義後,其結構無法修改。 |
INSERT 會同時寫入 Projection | 寫入時會增加一些 CPU 運算負擔。 |
OPTIMIZE TABLE 需執行 Projection Merge | Projection 資料寫入後,需執行 Optimize 來合併 Projection Parts。 |
Projections 是 ClickHouse 針對大規模聚合查詢加速的核心武器,透過適當的 Projection 設計,可以讓你的查詢效能瞬間提升數倍。
在需要報表統計、即時 Dashboard 的場景中,合理運用 Projections,能大幅降低系統負載與查詢延遲,成為大數據分析中的關鍵利器。