1108 字
6 分鐘
ClickHouse 系列:Projections 進階查詢加速技術

在處理大規模資料聚合查詢時,ClickHouse 除了靠 Partition Pruning、Data Skipping Index 來加速查詢(忘了再回去複習),還有一個極具威力的查詢優化武器 — Projections。
Projections 能夠透過預先排序、聚合或重組資料結構,讓查詢執行路徑變得更短、更快。
什麼是 Projection?
Projection 是一種儲存在 Table Parts 內部的物化結構 (Internal Materialized View),會針對特定查詢場景提前建立排序或聚合結果。
特性 | 說明 |
---|---|
屬於 Table 的一部分 | Projection 資料與 Table 共存在同一個資料片段 (Part)。 |
查詢時自動命中 | 不需修改查詢語法,ClickHouse 會自動選擇最小掃描量的 Projection。 |
可建立多個 Projection | 針對不同查詢需求定義不同 Projections。 |
Projection 的優勢
- 減少掃描資料量 → 只讀 Projection 部分資料,不需掃描全表。
- 加快聚合計算 → 預先計算好的聚合結果,查詢時直接使用。
- 降低 I/O 負載 → 磁碟讀取量大幅下降,查詢延遲降低。
範例
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 = 8192ASSELECT * FROM source_table;
ALTER TABLE user_eventsADD 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
只要查詢符合 Projection 結構,ClickHouse 會自動使用 Projection 來加速查詢:
SELECT EventDate, Action, count()FROM user_eventsWHERE 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_countsReadFromMergeTree (using projection)
實戰:Projections 加速 10 倍的案例
假設 user_events 有 10 億筆資料,執行以下查詢:
SELECT EventDate, Action, count()FROM user_eventsWHERE EventDate >= '2025-08-01'GROUP BY EventDate, Action;
- 未使用 Projection:需掃描完整 10 億筆資料,耗時 20 秒。
- 使用 Projection:只需掃描 1 千萬筆 Projection 資料,查詢僅需 2 秒。
這種場景特別適合 BI 報表、Dashboard 上的高頻聚合查詢。
注意事項與限制
限制項目 | 說明 |
---|---|
Projection 設計需事先規劃 | Projection 一旦定義後,其結構無法修改。 |
INSERT 會同時寫入 Projection | 寫入時會增加一些 CPU 運算負擔。 |
OPTIMIZE TABLE 需執行 Projection Merge | Projection 資料寫入後,需執行 Optimize 來合併 Projection Parts。 |
結語
Projections 是 ClickHouse 針對大規模聚合查詢加速的核心武器,透過適當的 Projection 設計,可以讓你的查詢效能瞬間提升數倍。
在需要報表統計、即時 Dashboard 的場景中,合理運用 Projections,能大幅降低系統負載與查詢延遲,成為大數據分析中的關鍵利器。
ClickHouse 系列持續更新中:
- ClickHouse 系列:ClickHouse 是什麼?與傳統 OLAP/OLTP 資料庫的差異
- ClickHouse 系列:ClickHouse 為什麼選擇 Column-based 儲存?講解 Row-based 與 Column-based 的核心差異
- ClickHouse 系列:ClickHouse 儲存引擎 - MergeTree
- ClickHouse 系列:壓縮技術與 Data Skipping Indexes 如何大幅加速查詢
- ClickHouse 系列:ReplacingMergeTree 與資料去重機制
- ClickHouse 系列:SummingMergeTree 進行資料彙總的應用場景
- ClickHouse 系列:Materialized Views 即時聚合查詢
- ClickHouse 系列:分區策略與 Partition Pruning 原理解析
- ClickHouse 系列:Primary Key、Sorting Key 與 Granule 索引運作原理
- ClickHouse 系列:CollapsingMergeTree 與邏輯刪除的最佳實踐
- ClickHouse 系列:VersionedCollapsingMergeTree 版本控制與資料衝突解決
- ClickHouse 系列:AggregatingMergeTree 實時指標統計的進階應用
- ClickHouse 系列:Distributed Table 與分布式查詢架構
- ClickHouse 系列:Replicated Tables 高可用性與零停機升級實作
- ClickHouse 系列:與 Kafka 整合打造即時 Data Streaming Pipeline
- ClickHouse 系列:批次匯入最佳實踐 (CSV、Parquet、Native Format)
- ClickHouse 系列:ClickHouse 與外部資料源整合(PostgreSQL)
- ClickHouse 系列:如何提升查詢優化?system.query_log 與 EXPLAIN 用法
- ClickHouse 系列:Projections 進階查詢加速技術
- ClickHouse 系列:Sampling 抽樣查詢與統計技術原理
- ClickHouse 系列:TTL 資料清理與儲存成本優化
- ClickHouse 系列:儲存政策(Storage Policies)與磁碟資源分層策略
- ClickHouse 系列:表格設計與儲存優化細節
- ClickHouse 系列:ClickHouse 系列:整合 Grafana 打造可視化監控
- ClickHouse 系列:APM 日誌分析平台架構實作 (Vector + ClickHouse)
- ClickHouse 系列:IoT 巨量感測資料平台設計實戰
- ClickHouse 系列:與 BI 工具整合(Power BI)
- ClickHouse 系列:ClickHouse Cloud 與自建部署的優劣比較
- ClickHouse 系列:資料庫安全性與權限管理(RBAC)實作
ClickHouse 系列:Projections 進階查詢加速技術
https://vicwen.app/posts/clickhouse-projections-optimization/