clickhouse21.7.11.3 SQL-SAMPLE 数据采样

说明

SAMPLE 子句允许近似于 SELECT 查询处理。

启用数据采样时,不会对所有数据执行查询,而只对特定部分数据(样本)执行查询。

例如,如果需要计算所有访问的统计信息,只需对所有访问的 1/10的数据 执行查询,然后将结果乘以10即可。

应用场景

  • 有严格的时间需求(如<100ms),但不能添加服务器
  • 当原始数据不准确时,近似值不会明显降低计算准确率
  • 业务需求的目标是近似结果

数据采样的功能:

  1. 数据采样是一种确定性机制。 同样的结果 SELECT .. SAMPLE 查询始终是相同的。

  2. 对于不同的表,采样工作始终如一。 对于具有单个采样键的表,具有相同系数的采样总是选择相同的数据。

  3. 采样允许从磁盘读取更少的数据。

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)

注意:

  1. 定义按照 intHash32(UserID)分布后的结果采样查询。

  2. 声明 Sample KEY 时,遵守以下两条:

    1. sample by 所声明的表达式必须同时包含在主键的声明内
    2. 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


原文出处:/show_1IX3R8P7e1MQ.html