SAMPLE 句を使用すると、SELECT クエリを近似的に処理できます。
データサンプリングが有効な場合、クエリは全データではなく、その一部のデータ (サンプル) に対してのみ実行されます。たとえば、すべての visits の統計を計算する必要がある場合、全 visits の 1/10 に対してクエリを実行し、その結果を 10 倍すれば十分です。
近似的なクエリ処理は、次のような場合に役立ちます。
- 厳しいレイテンシ要件 (たとえば 100ms 未満) がある一方で、それを満たすための追加ハードウェアコストを正当化できない場合。
- 生データ自体の精度が高くなく、近似しても品質が目立って低下しない場合。
- ビジネス要件として近似結果で十分な場合 (コスト効率のため、あるいは正確な結果をプレミアムユーザー向けに提供する場合) 。
サンプリングを使用できるのは、MergeTree ファミリーのテーブルのみであり、かつテーブル作成時にサンプリング式が指定されている場合に限られます (MergeTree engine を参照) 。
- データサンプリングは決定論的な仕組みです。同じ
SELECT .. SAMPLEクエリは、常に同じ結果になります。 - サンプリングは、異なるテーブル間でも一貫して機能します。単一のサンプリングキーを持つテーブルでは、同じ係数のサンプルは常に同じデータの部分集合を選択します。たとえば、ユーザー ID のサンプルでは、異なるテーブルであっても、取り得るすべてのユーザー ID のうち同じ部分集合に属する行が取得されます。つまり、IN 句のサブクエリでサンプルを使用できます。また、JOIN 句を使ってサンプル同士を結合することもできます。
- サンプリングを使用すると、ディスクから読み取るデータ量を減らせます。ただし、サンプリングキーは正しく指定する必要があります。詳しくは、Creating a MergeTree Table を参照してください。
SAMPLE 句では、次の構文をサポートしています。
| SAMPLE Clause Syntax | Description |
|---|---|
SAMPLE k | ここで k は 0 から 1 までの数です。クエリはデータの k の割合に対して実行されます。たとえば、SAMPLE 0.1 はデータの 10% に対してクエリを実行します。詳しくはこちら |
SAMPLE n | ここで n は十分に大きい整数です。クエリは少なくとも n 行のサンプルに対して実行されます (ただし、それを大幅に超えることはありません) 。たとえば、SAMPLE 10000000 は最低 10,000,000 行に対してクエリを実行します。詳しくはこちら |
SAMPLE k OFFSET m | ここで k と m は 0 から 1 までの数です。クエリはデータの k の割合のサンプルに対して実行されます。サンプルに使用されるデータは m の割合だけオフセットされます。詳しくはこちら |
SAMPLE K
k は 0 から 1 までの数です (分数表記と小数表記の両方を使用できます) 。たとえば、SAMPLE 1/2 や SAMPLE 0.5 です。
SAMPLE k 句では、データの k の割合に対してサンプリングが行われます。例を以下に示します。
count() の値を手動で 10 倍します。
SAMPLE N
n は十分に大きな整数です。たとえば、SAMPLE 10000000 です。
この場合、クエリは少なくとも n 行のサンプルに対して実行されます (ただし、それを大幅に上回ることはありません) 。たとえば、SAMPLE 10000000 では、最低 10,000,000 行を対象にクエリが実行されます。
データ読み取りの最小単位は 1 つの granule (そのサイズは index_granularity 設定で指定されます) であるため、サンプルは granule のサイズより十分大きく設定するのが合理的です。
SAMPLE n 句を使用する場合、データ全体のうち何パーセントが処理されたのかはわかりません。そのため、集約関数にどの係数を掛ければよいかもわかりません。概算結果を得るには、_sample_factor 仮想カラムを使用してください。
_sample_factor カラムには、動的に計算される相対係数が格納されます。このカラムは、指定したサンプリングキーを持つテーブルを 作成 すると自動的に作成されます。_sample_factor カラムの使用例を以下に示します。
サイト訪問の統計を含む visits テーブルを考えてみましょう。最初の例では、ページビュー数の計算方法を示します。
SAMPLE K OFFSET M
k と m は 0 から 1 までの数値です。以下に例を示します。
例 1
[++------------]
例 2
[------++------]