1185 字
6 分鐘
ClickHouse 系列:Sampling 抽樣查詢與統計技術原理

當面對 PB 級大數據查詢時,如何在不影響統計結論的前提下,快速獲得近似結果?ClickHouse 提供了高效的 Sampling 抽樣查詢技術,讓你能夠用「1% 的資料,取得 95% 準確度的結果」。

什麼是 Sampling?#

Sampling 是一種讓查詢只掃描部分資料進行統計預估的技術,主要應用於:

  • Dashboard 即時指標大盤
  • PB 級大數據近似統計查詢
  • 全表掃描耗時過久的場景

ClickHouse 透過「Sampling Key」來實現有序與隨機性兼具的抽樣機制。

工作原理#

  1. SAMPLE BY 欄位為 Hash 分布基準。
  2. 查詢時可透過 SAMPLE K 讓 ClickHouse 只掃描 K 百分比的資料。
  3. 抽樣是確定性的,對同一條件查詢結果不會改變。
  4. 跨表 Sampling Key 一致時,可支援 JOIN/IN 子查詢下的抽樣一致性。

SAMPLE 語法用法與差異#

1. SAMPLE k#

  • k 為 0 到 1 的浮點數。
  • 查詢會隨機挑選約 k 比例的資料片段 (Granules) 進行處理。
  • 聚合值需手動乘上 K 倍來還原近似統計結果。
SELECT Action, count() * 10 AS cnt
FROM user_events
SAMPLE 0.1
GROUP BY Action;

這段 SQL 會只讀取 10% 資料,查詢結果再乘上 10 還原。

2. SAMPLE N#

  • N 為目標處理的行數 (近似值)。
  • ClickHouse 會掃描至少 N 筆資料的顆粒 (Granules)。
  • 使用 _sample_factor 虛擬欄位來自動估算放大倍率。
SELECT sum(PageViews * _sample_factor)
FROM visits
SAMPLE 10000000;
SELECT sum(_sample_factor)
FROM visits
SAMPLE 10000000;

3. SAMPLE k OFFSET m#

  • k: 取樣比例
  • m: 取樣偏移量 (0~1 之間)
  • 可用於避免不同查詢 sample 重疊相同資料區塊。
SELECT *
FROM visits
SAMPLE 0.1 OFFSET 0.5;

建表時指定 Sampling Key#

MergeTree 家族表引擎 支援 Sampling,且建表時需指定 Sampling Key。

CREATE TABLE user_events
(
EventDate DateTime,
UserID UInt64,
Action String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(EventDate)
ORDER BY (UserID, EventDate)
SAMPLE BY intHash64(UserID);

選擇高 Cardinality 且分佈均勻的欄位 (如 UserID) 作為 SAMPLE BY 是關鍵。

範例:從 20 秒降到 2 秒#

原始查詢 (全表掃描)#

SELECT Action, count() FROM user_events GROUP BY Action;
-- 查詢花了:20 秒

抽樣查詢 (SAMPLE 0.1)#

SELECT Action, count() * 10 FROM user_events SAMPLE 0.1 GROUP BY Action;
-- 查詢花了:2 秒

相較於全表掃描,抽樣查詢時間縮短 10 倍,且統計結果的誤差率維持在 5% 以內。

Sampling 查詢驗證#

透過 EXPLAIN ESTIMATE 可預估查詢將掃描的資料量。

EXPLAIN ESTIMATE SELECT * FROM user_events SAMPLE 0.1;
partsmarksrows
10/10100/10100,000,000 / 10,000,000

常見問題與誤區#

問題解決建議
SAMPLE 查詢無效 → 還是全表掃描建表時必須指定 SAMPLE BY Key。
抽樣比例選得太小 → 統計結果誤差大建議 SAMPLE 0.05~0.2 之間較佳。
SAMPLE BY 欄位選錯 → 抽樣效果失真選擇分佈均勻的欄位 (如 UserID) 來避免偏倚。

結語#

Sampling 是 ClickHouse 面對大數據場景中極具威力的查詢加速技術,只需簡單設定 SAMPLE BY 與 SAMPLE 百分比,即可輕鬆取得秒級的近似查詢結果,大幅減輕系統 I/O 與計算壓力。

ClickHouse 系列持續更新中:#

  1. ClickHouse 系列:ClickHouse 是什麼?與傳統 OLAP/OLTP 資料庫的差異
  2. ClickHouse 系列:ClickHouse 為什麼選擇 Column-based 儲存?講解 Row-based 與 Column-based 的核心差異
  3. ClickHouse 系列:ClickHouse 儲存引擎 - MergeTree
  4. ClickHouse 系列:壓縮技術與 Data Skipping Indexes 如何大幅加速查詢
  5. ClickHouse 系列:ReplacingMergeTree 與資料去重機制
  6. ClickHouse 系列:SummingMergeTree 進行資料彙總的應用場景
  7. ClickHouse 系列:Materialized Views 即時聚合查詢
  8. ClickHouse 系列:分區策略與 Partition Pruning 原理解析
  9. ClickHouse 系列:Primary Key、Sorting Key 與 Granule 索引運作原理
  10. ClickHouse 系列:CollapsingMergeTree 與邏輯刪除的最佳實踐
  11. ClickHouse 系列:VersionedCollapsingMergeTree 版本控制與資料衝突解決
  12. ClickHouse 系列:AggregatingMergeTree 實時指標統計的進階應用
  13. ClickHouse 系列:Distributed Table 與分布式查詢架構
  14. ClickHouse 系列:Replicated Tables 高可用性與零停機升級實作
  15. ClickHouse 系列:與 Kafka 整合打造即時 Data Streaming Pipeline
  16. ClickHouse 系列:批次匯入最佳實踐 (CSV、Parquet、Native Format)
  17. ClickHouse 系列:ClickHouse 與外部資料源整合(PostgreSQL)
  18. ClickHouse 系列:如何提升查詢優化?system.query_log 與 EXPLAIN 用法
  19. ClickHouse 系列:Projections 進階查詢加速技術
  20. ClickHouse 系列:Sampling 抽樣查詢與統計技術原理
  21. ClickHouse 系列:TTL 資料清理與儲存成本優化
  22. ClickHouse 系列:儲存政策(Storage Policies)與磁碟資源分層策略
  23. ClickHouse 系列:表格設計與儲存優化細節
  24. ClickHouse 系列:ClickHouse 系列:整合 Grafana 打造可視化監控
  25. ClickHouse 系列:APM 日誌分析平台架構實作 (Vector + ClickHouse)
  26. ClickHouse 系列:IoT 巨量感測資料平台設計實戰
  27. ClickHouse 系列:與 BI 工具整合(Power BI)
  28. ClickHouse 系列:ClickHouse Cloud 與自建部署的優劣比較
  29. ClickHouse 系列:資料庫安全性與權限管理(RBAC)實作
ClickHouse 系列:Sampling 抽樣查詢與統計技術原理
https://vicwen.app/posts/clickhouse-sampling-statistics/
作者
Vic Wen
發佈於
2025-08-23
許可協議
CC BY-NC-SA 4.0