SAMPLE | ClickHouse Documentation
SAMPLE子 句能够实现数据采样的功能,使查询仅返回采样数据而不是全部数据,从而有效减少查询负载。
SAMPLE 子句的采样机制是一种幂等设计,也就是说在数据不发生变化的情况下,使用相同的采样规则总是能够返回相同的数据,所以这项特性非常适合在那些可以接受近似查询结果的场合使用。
例如在数据量十分巨大的情况下,对查询时效性的要求大于准确性时就可以尝试使用 SAMPLE 子句。
SAMPLE 子句只能用于 MergeTree 系列引擎的数据表,并且要求在 CREATE TABLE 时声明 SAMPLE BY 抽样表达式,例如下面的语句:
-- SAMPLE BY 表示 hits_v1 内的数据,可以按照 intHash32(UserID) 分布后的结果采样查询。
CREATE TABLE hits_v1 (
CounterID UInt64,
EventDate DATE,
UserID UInt64
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, intHash32(UserID))
--Sample Key声明的表达式必须也包含在主键的声明中
SAMPLE BY intHash32(UserID)
在声明 Sample Key 的时候有两点需要注意:
SAMPLE 子句目前支持如下 3 种用法:
SAMPLE factor 表示按因子系数采样,其中 factor 表示采样因子,它的取值支持 0~1 之间的小数。如果 factor 设置为 0 或者 1,则效果等同于不进行数据采样。如下面的语句表示按 10% 的因子采样数据:
SELECT CounterID FROM hits_v1 **SAMPLE 0.1
--** factor 也支持使用十进制的形式表述:
SELECT CounterID FROM hits_v1 **SAMPLE 1/10**
在进行统计查询时,为了得到最终的近似结果,需要将得到的直接结果乘以采样系数。例如若想按 0.1 的因子采样数据,则需要将统计结果放大 10 倍:
SELECT count() * 10 FROM hits_v1 **SAMPLE 0.1**
一种更为优雅的方法是借助虚拟字段 _sample_factor
来获取采样系数,并以此代替硬编码的形式。_sample_factor 可以返回当前查询所对应的采样系数:
SELECT CounterID, _sample_factor FROM hits_v1 SAMPLE 0.1 LIMIT 2
┌─CounterID───┬───_sample_factor────┐
│ 57 │ 10 │
│ 57 │ 10 │
└─────────────┴─────────────────────┘