SAMPLE句
SAMPLE
句は、近似的なSELECT
クエリ処理を可能にします。
データサンプリングが有効になっている場合、クエリはすべてのデータではなく、特定のデータの割合(サンプル)のみで実行されます。たとえば、すべての訪問の統計を計算する必要がある場合、すべての訪問の1/10の割合でクエリを実行し、その結果を10倍すれば十分です。
近似的なクエリ処理は、以下のような場合に役立ちます:
- 厳格なレイテンシ要件がある(100ms未満など)が、それを満たすための追加ハードウェアリソースのコストを正当化できない場合。
- 生データが正確でないため、近似が品質を著しく低下させない場合。
- ビジネス要件が近似的な結果をターゲットにしている場合(コスト効率のためや、プレミアムユーザーに正確な結果をマーケティングするため)。
データサンプリングの機能は以下の通りです:
- データサンプリングは決定論的なメカニズムです。同じ
SELECT .. SAMPLE
クエリの結果は常に同じです。 - サンプリングは異なるテーブルで一貫して機能します。単一のサンプリングキーを持つテーブルの場合、同じ係数のサンプルは常に同じ可能なデータのサブセットを選択します。たとえば、ユーザーIDのサンプルは、異なるテーブルからすべての可能なユーザーIDの同じサブセットを持つ行を取得します。これは、IN句のサブクエリでサンプルを使用できることを意味します。また、JOIN句を使用してサンプルを結合できます。
- サンプリングは、ディスクから読み取るデータ量を減らすことを可能にします。サンプリングキーを正しく指定する必要があることに注意してください。詳細については、MergeTreeテーブルの作成を参照してください。
SAMPLE
句に対してサポートされている構文は以下の通りです:
SAMPLE句構文 | 説明 |
---|---|
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
の割合からサンプルが取得されます。以下に例を示します:
この例では、クエリは0.1(10%)のデータからサンプルを実行します。集計関数の値は自動的に補正されないため、近似結果を得るにはcount()
の値を手動で10倍にする必要があります。
SAMPLE N
ここでn
は十分に大きな整数です。たとえば、SAMPLE 10000000
。
この場合、クエリは少なくともn
行のサンプルで実行されます(ただし、これよりもはるかに多くはありません)。たとえば、SAMPLE 10000000
は最小10,000,000行でクエリを実行します。
データを読み取るための最小単位は1グラニュールであるため(そのサイズはindex_granularity
設定によって設定されます)、グラニュールのサイズよりもはるかに大きいサンプルを設定することが理にかなっています。
SAMPLE n
句を使用すると、処理されたデータの相対パーセントがわかりません。したがって、集計関数をどの係数で掛けるべきかもわかりません。近似結果を得るには、_sample_factor
仮想カラムを使用してください。
_sample_factor
カラムには、動的に計算された相対係数が含まれています。このカラムは、指定されたサンプリングキーでテーブルを作成すると自動的に作成されます。_sample_factor
カラムの使用例は以下に示します。
visits
テーブルを考えてみましょう。このテーブルには、サイト訪問の統計が含まれています。最初の例は、ページビューの数を計算する方法を示しています:
次の例は、総訪問数を計算する方法を示しています:
以下の例は、平均セッションの長さを計算する方法を示しています。平均値を計算するために相対係数を使用する必要はありません。
SAMPLE K OFFSET M
ここでk
とm
は0から1の範囲の数です。以下に例を示します。
例1
この例では、サンプルはすべてのデータの1/10です:
[++------------]
例2
ここでは、データの後半から10%のサンプルが取得されます。
[------++------]