iT邦幫忙

2025 iThome 鐵人賽

DAY 19
1
Software Development

ClickHouse 系列:從資料庫底層架構到軟體應用實踐系列 第 19

Day 19 | ClickHouse 系列:Projections 進階查詢加速技術

  • 分享至 

  • xImage
  •  

在處理大規模資料聚合查詢時,ClickHouse 除了靠 Partition Pruning、Data Skipping Index 來加速查詢(忘了再回去複習),還有一個極具威力的查詢優化武器 — Projections

Projections 能夠透過預先排序、聚合或重組資料結構,讓查詢執行路徑變得更短、更快

什麼是 Projection?

Projection 是一種儲存在 Table Parts 內部的物化結構 (Internal Materialized View),會針對特定查詢場景提前建立排序或聚合結果。

特性 說明
屬於 Table 的一部分 Projection 資料與 Table 共存在同一個資料片段 (Part)。
查詢時自動命中 不需修改查詢語法,ClickHouse 會自動選擇最小掃描量的 Projection。
可建立多個 Projection 針對不同查詢需求定義不同 Projections。

Projection 的優勢

  1. 減少掃描資料量 → 只讀 Projection 部分資料,不需掃描全表。
  2. 加快聚合計算 → 預先計算好的聚合結果,查詢時直接使用。
  3. 降低 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 = 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

只要查詢符合 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)

實戰:Projections 加速 10 倍的案例

假設 user_events 有 10 億筆資料,執行以下查詢:

SELECT EventDate, Action, count() 
FROM user_events 
WHERE 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,能大幅降低系統負載與查詢延遲,成為大數據分析中的關鍵利器。


上一篇
Day 18 | ClickHouse 系列:如何提升查詢優化?system.query_log 與 EXPLAIN 用法
下一篇
Day 20 | ClickHouse 系列:Sampling 抽樣查詢與統計技術原理
系列文
ClickHouse 系列:從資料庫底層架構到軟體應用實踐30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言