iT邦幫忙

2025 iThome 鐵人賽

DAY 20
1
Software Development

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

Day 20 | ClickHouse 系列:Sampling 抽樣查詢與統計技術原理

  • 分享至 

  • xImage
  •  

當面對 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;
parts marks rows
10/10 100/10 100,000,000 / 10,000,000

常見問題與誤區

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

結語

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


上一篇
Day 19 | ClickHouse 系列:Projections 進階查詢加速技術
下一篇
Day 21 | ClickHouse 系列:TTL 資料清理與儲存成本優化
系列文
ClickHouse 系列:從資料庫底層架構到軟體應用實踐30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言