1。概要
注意:
sample子句只能用于MergeTree系列引擎的数据表,并且在create table的时候就声明sample by 抽样表达式。
sample句で提供される近似计算
関数は、データサンプリングの機能を実現できるため、クエリはすべてのデータではなくサンプリングされたデータのみを返すため、クエリの負荷が効果的に軽減されます。
sample子句的采样设计是一种幂等设计,即在数据发生变化的时候使用相同的采样规则能返回相同的数据
。この機能は、おおよそのクエリ結果を受け入れることができるシナリオに非常に適しています。
公式は、次の使用シナリオを提供します。
- 厳密なタイミング要件(<100msなど)があるが
、それらを満たすために追加のハードウェアリソースのコストを正当化できない場合。 - 生データが正確でない場合、近似によって品質が著しく低下することはありません。
- ビジネス要件は、おおよその結果を対象としています(費用対効果のため、または正確な結果を
プレミアムユーザーに販売するため)。
Clickhouse> create table clicks(CounterID UInt64,EventDate DATE, UserID UInt64) engine=MergeTree()
order by (CounterID,intHash32(UserID)) sample by intHash32(UserID);
CREATE TABLE clicks
(
`CounterID` UInt64,
`EventDate` DATE,
`UserID` UInt64
)
ENGINE = MergeTree()
ORDER BY (CounterID, intHash32(UserID))
SAMPLE BY intHash32(UserID)
テストデータを挿入します。
Clickhouse> insert into clicks select CounterID,EventDate,UserID from hits_v1;
INSERT INTO clicks SELECT
CounterID,
EventDate,
UserID
FROM hits_v1
Ok.
0 rows in set. Elapsed: 1.003 sec. Processed 8.87 million rows, 124.23 MB (8.85 million rows/s., 123.88 MB/s.)
クリックテーブルの定義は、intHash32(UserID)配布の結果に従ってサンプリングされ、照会されます。
サンプルKEYを宣言する際に注意すべき点が2つあります。
sample by 所声明的表达式必须同时包含在主键的声明内
sample key必须UInt类型,若不是可以定义但是查询的时候会抛出异常
。
SAMPLE句は、次の3つの形式をサポートします。
1.sample k
kは、係数係数、サンプリング係数を表し、値の範囲は[0,1]です。10進数が0〜1の場合はサンプリングを意味し、0または1の場合は次のようになります。サンプリングではありません。
select CounterID from clicks sample 0.1
等同于:
select CounterID from clicks sample 1/10
おおよその結果を取得するためのクエリ:
Clickhouse> select count() from clicks;
SELECT count()
FROM clicks
┌─count()─┐
│ 8873898 │
└─────────┘
1 rows in set. Elapsed: 0.003 sec.
Clickhouse> select count() from clicks sample 0.1;
SELECT count()
FROM clicks
SAMPLE 1 / 10
┌─count()─┐
│ 839889 │
└─────────┘
1 rows in set. Elapsed: 0.029 sec. Processed 5.89 million rows, 94.27 MB (201.86 million rows/s., 3.23 GB/s.)
Clickhouse> select CounterID,_sample_factor from clicks sample 0.1 limit 2;
SELECT
CounterID,
_sample_factor
FROM clicks
SAMPLE 1 / 10
LIMIT 2
┌─CounterID─┬─_sample_factor─┐
│ 57 │ 10 │
│ 57 │ 10 │
└───────────┴────────────────┘
2 rows in set. Elapsed: 0.012 sec.
サンプリング係数は、仮想フィールド_sample_factorを介して照会できます。
2.
サンプルnnは、サンプリングされたサンプルの数を表します。nは、少なくともサンプリングされるデータの行数を示します。n = 1は、サンプリングが使用されないことを意味し、nの範囲は2からテーブルの行の総数です。
Clickhouse> select count() from clicks sample 10000;
SELECT count()
FROM clicks
SAMPLE 10000
┌─count()─┐
│ 9251 │
└─────────┘
1 rows in set. Elapsed: 0.025 sec. Processed 5.48 million rows, 87.72 MB (223.47 million rows/s., 3.58 GB/s.)
Clickhouse> select count()*any(_sample_factor) from clicks sample 10000;
SELECT count() * any(_sample_factor)
FROM clicks
SAMPLE 10000
┌─multiply(count(), any(_sample_factor))─┐
│ 8154379.059200001 │
└────────────────────────────────────────┘
1 rows in set. Elapsed: 0.024 sec. Processed 5.48 million rows, 54.82 MB (229.44 million rows/s., 2.29 GB/s.)
Clickhouse> select CounterID,_sample_factor from clicks sample 10000 limit 2;
SELECT
CounterID,
_sample_factor
FROM clicks
SAMPLE 10000
LIMIT 2
┌─CounterID─┬────_sample_factor─┐
│ 1294 │ 881.4592000000001 │
└───────────┴───────────────────┘
┌─CounterID─┬────_sample_factor─┐
│ 1366 │ 881.4592000000001 │
└───────────┴───────────────────┘
2 rows in set. Elapsed: 0.041 sec. Processed 7.69 thousand rows, 123.01 KB (187.84 thousand rows/s., 3.01 MB/s.)
データサンプリングの範囲は概算値であり、サンプリングされたデータの最小粒度はindex_granularityによって決定されます。
nの値をインデックスの粒度よりも小さく設定しても意味がありません。
3.サンプルkオフセットn
は、因子係数とオフセットに従ったサンプリングを意味します。
Clickhouse> select CounterID,_sample_factor from clicks sample 0.4 offset 0.5 limit 1;
SELECT
CounterID,
_sample_factor
FROM clicks
SAMPLE 4 / 10 OFFSET 5 / 10
LIMIT 1
┌─CounterID─┬─_sample_factor─┐
│ 57 │ 2.5 │
└───────────┴────────────────┘
1 rows in set. Elapsed: 0.017 sec.
Clickhouse> select CounterID,_sample_factor from clicks sample 0.6 offset 0.5 limit 1;
SELECT
CounterID,
_sample_factor
FROM clicks
SAMPLE 6 / 10 OFFSET 5 / 10
LIMIT 1
┌─CounterID─┬─────_sample_factor─┐
│ 57 │ 1.6666666666666667 │
└───────────┴────────────────────┘
1 rows in set. Elapsed: 0.007 sec.
サンプリング係数がオーバーフローすると(オフセットの値+サンプルの値が1より大きい)、オーバーフローしたデータは自動的にステージングされます。