说明
SAMPLE 子句允许近似于 SELECT 查询处理。
启用数据采样时,不会对所有数据执行查询,而只对特定部分数据(样本)执行查询。
例如,如果需要计算所有访问的统计信息,只需对所有访问的 1/10的数据 执行查询,然后将结果乘以10即可。
应用场景
- 有严格的时间需求(如
<100ms),但不能添加服务器 - 当原始数据不准确时,近似值不会明显降低计算准确率
- 业务需求的目标是近似结果
数据采样的功能:
数据采样是一种确定性机制。 同样的结果
SELECT .. SAMPLE查询始终是相同的。对于不同的表,采样工作始终如一。 对于具有单个采样键的表,具有相同系数的采样总是选择相同的数据。
采样允许从磁盘读取更少的数据。
SAMPLE 子句支持以下语法
例子
建表
建表时,需要指定 采样字段,如下:
create table t_student_smp
(
sid UInt32,
name String,
age int,
create_time Datetime
)
engine = MergeTree
partition by toYYYYMMDD(create_time)
PRIMARY KEY (intHash32(sid))
order by (intHash32(sid),age)
SAMPLE BY intHash32(sid)
注意:
定义按照
intHash32(UserID)分布后的结果采样查询。声明
Sample KEY时,遵守以下两条:sample by所声明的表达式必须同时包含在主键的声明内sample key必须UInt类型,若不是可以定义但是查询的时候会抛出异常。
插入数据
注意:至少要插入300条数据
insert into t_student_smp values
(1,'lucy',22,'2022-01-02 09:30:00'),
(2,'lili',22,'2022-01-02 09:50:00'),
(3,'张三',21,'2022-01-02 09:50:00'),
(4,'韩梅梅',21,'2022-01-01 09:30:00'),
(5,'李雷',20,'2022-01-01 09:30:00'),
(1,'lucy',22,'2022-01-02 09:30:00'),
(2,'lili',22,'2022-01-02 09:50:00'),
(3,'张三',21,'2022-01-02 09:50:00'),
(4,'韩梅梅',21,'2022-01-01 09:30:00'),
(5,'李雷',20,'2022-01-01 09:30:00'),
(1,'lucy',22,'2022-01-02 09:30:00'),
(2,'lili',22,'2022-01-02 09:50:00'),
(3,'张三',21,'2022-01-02 09:50:00'),
(4,'韩梅梅',21,'2022-01-01 09:30:00'),
(5,'李雷',20,'2022-01-01 09:30:00'),
(1,'lucy',22,'2022-01-02 09:30:00'),
(2,'lili',22,'2022-01-02 09:50:00'),
(3,'张三',21,'2022-01-02 09:50:00'),
(4,'韩梅梅',21,'2022-01-01 09:30:00'),
(5,'李雷',20,'2022-01-01 09:30:00');
插入 一千万 数据
INSERT INTO TABLE t_student_smp(sid,name,age,create_time)
SELECT number AS sid, '李雷',20, now() AS create_time FROM
numbers(10000000);
查询采样
select * from t_student_smp SAMPLE 0.4
查询结果数量:总共记录数 * 0.4
查询数量
select count() from t_student_smp SAMPLE 0.4
执行结果:
120
计算过程:总共记录数300 * 0.4 = 120
低于100显示0
注意:当表中数据量不够多时,低于 100 显示0(如果超过一千万,就能显示)
select count() from t_student_smp SAMPLE 0.3
执行结果:
0
计算过程:总共记录数300 * 0.3 = 90 ,低于100 显示 0
参考:
https://clickhouse.com/docs/zh/sql-reference/statements/select/sample/
https://blog.csdn.net/vkingnew/article/details/107090352
