當面對 PB 級大數據查詢時,如何在不影響統計結論的前提下,快速獲得近似結果?ClickHouse 提供了高效的 Sampling 抽樣查詢技術,讓你能夠用「1% 的資料,取得 95% 準確度的結果」。
Sampling 是一種讓查詢只掃描部分資料進行統計預估的技術,主要應用於:
ClickHouse 透過「Sampling Key」來實現有序與隨機性兼具的抽樣機制。
SELECT Action, count() * 10 AS cnt
FROM user_events
SAMPLE 0.1
GROUP BY Action;
這段 SQL 會只讀取 10% 資料,查詢結果再乘上 10 還原。
SELECT sum(PageViews * _sample_factor)
FROM visits
SAMPLE 10000000;
SELECT sum(_sample_factor)
FROM visits
SAMPLE 10000000;
SELECT *
FROM visits
SAMPLE 0.1 OFFSET 0.5;
僅 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 是關鍵。
SELECT Action, count() FROM user_events GROUP BY Action;
-- 查詢花了:20 秒
SELECT Action, count() * 10 FROM user_events SAMPLE 0.1 GROUP BY Action;
-- 查詢花了:2 秒
相較於全表掃描,抽樣查詢時間縮短 10 倍,且統計結果的誤差率維持在 5% 以內。
透過 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 與計算壓力。