SAMPLE 子句

简介: SAMPLE 子句

SAMPLE 子句能够实现数据采样的功能,使查询仅返回采样数据而不是全部数据,从而有效减少查询负担。SAMPLE子句的采样机制是一种幂等设计,也就是说在数据不发生变化的情况下,使用相同的采样规则总是能够返回相同的数据,所以这项特性非常适合在那些可以接受近似查询结果的场合使用。例如在数据量十分巨大的情况下,对查询时效性的要求大于准确性时就可以尝试使用SAMPLE子句。


SAMPLE子句只能用于MergeTree系列引擎的数据表,并且要求在CREATE TABLE时声明SAMPLE BY抽样表达式,例如下面的语句:

$ 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 BY 表示hits_v1内的数据,可以按照intHash32(UserID)分布后的结果采样查询。


在声明Sample Key的时候有两点需要注意:

  1. SAMPLE BY所声明的表达式必须同时包含在主键的声明内。
  2. Sample Key必须是Int类型,如若不是,ClickHouse在进行CREATE TABLE操作时也不会报错,但在数据查询时会得到如下类似异常:


Invalid sampling column type in storage parameters: Float32. Must by unsigned integer type.点击复制复制失败已复制


SAMPLE 子句目前支持如下3中用法:


SAMPLE factor

SAMPLE factor表示按因子系数采样,其中factor表示采样因子,它的取值支持0~1之间的小数。如果factor设置为0或者1,则效果等同于不进行数据采样。如下面的语句表示按10%的因子采样数据:

$ SELECT CounterID FROM hits_v1 SAMPLE 0.1;点击复制复制失败已复制


factor也支持使用十进制的形式表述:

$ SELECT CounterID FROM hits_v2 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;点击复制复制失败已复制


在使用_sample_factor之后,可以将之前的查询语句改写成如下形式:

$ SELECT count() * any(_sample_factor) FROM hits_v1 SAMPLE 0.1;点击复制复制失败已复制


SAMPLE rows

SAMPLE rows 表示按样本数量采样,其中rows表示至少采样多少行数据,它的取值必须是大于1的整数。如果rows的取值大于表内数据的总行数,则效果等于rows = 1(即不使用采样)。


下面的语句表示采样10000行数据:

$ SELECT count() FROM hits_v1 SAMPLE 10000;
目录
相关文章
|
2月前
|
JSON 关系型数据库 MySQL
EXPLAIN Join Types
`EXPLAIN` 输出的 `type` 列描述了表连接方式,从最优到最差包括:`system`(单行系统表)、`const`(最多一行,视为常量)、`eq_ref`(最佳连接类型,用于主键或唯一索引)、`ref`(基于索引的部分匹配)、`fulltext`(全文索引)、`ref_or_null`(包含 NULL 值的行)、`index_merge`(索引合并优化)、`unique_subquery` 和 `index_subquery`(索引查找替代子查询)、`range`(索引范围内检索)、`index`(索引扫描)、`ALL`(全表扫描,通常最差)。
|
2月前
|
关系型数据库 MySQL 索引
EXPLAIN Output Interpretation
通过分析`EXPLAIN`输出的行列乘积,可评估MySQL连接效率,估算查询所需检查的行数。该乘积还影响`max-join-size`系统变量对多表SELECT语句的执行与中止决策。示例展示了如何逐步优化多表连接,通过调整列类型和大小来减少行乘积,从而提高查询性能。最终,结合索引分析,实现更优的连接效果。
可以使用 UNION 或者 UNION ALL 来合并多个 SELECT 语句的结果
可以使用 UNION 或者 UNION ALL 来合并多个 SELECT 语句的结果
253 7
|
数据库
解决which is not functionally dependent on columns in GROUP BY clause;...sql_mode=only_full_group_by
解决which is not functionally dependent on columns in GROUP BY clause;...sql_mode=only_full_group_by
278 0
|
存储 SQL 关系型数据库
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column的解决办法
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column的解决办法
181 0
|
SQL 分布式计算 Spark
SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)
SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)
727 0
SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)
GROUP BY语句规定
GROUP BY语句规定
71 0
ORDER BY子句
ORDER BY子句
54 0
|
SQL
GROUP BY 语句
GROUP BY 语句
82 0