SAMPLE句
SAMPLE
句は、近似されたSELECT
クエリ処理を可能にします。
データサンプリングが有効になっている場合、クエリはすべてのデータではなく、特定のデータの一部(サンプル)に対してのみ実行されます。例えば、すべての訪問の統計を計算する必要がある場合、すべての訪問の10分の1のデータに対してクエリを実行し、その結果を10倍するだけで済みます。
近似クエリ処理は以下の場合に有用です:
- 厳密なレイテンシ要件(100ms未満など)があるが、それに対応するための追加のハードウェアリソースのコストを正当化できない場合。
- 生データが正確でないため、近似が品質を顕著に低下させない場合。
- ビジネス要件が近似値をターゲットにしている場合(コスト効率のためや、プレミアムユーザーに正確な結果を提供するため)。
データサンプリングの特徴は以下の通りです:
- データサンプリングは決定論的メカニズムです。同じ
SELECT .. SAMPLE
クエリの結果は常に同じです。 - サンプリングは異なるテーブルで一貫して機能します。単一のサンプリングキーを持つテーブルの場合、同じ係数のサンプルは常に同じデータの部分集合を選択します。たとえば、ユーザーIDのサンプルは、異なるテーブルから可能なすべてのユーザーIDの同じ部分集合を取り込みます。これにより、IN句のサブクエリでサンプルを使用できます。また、JOIN句を使用してサンプルを結合できます。
- サンプリングにより、ディスクから読み取るデータ量を減少させることができます。サンプリングキーを正しく指定する必要があることに注意してください。詳細については、MergeTreeテーブルの作成を参照してください。
SAMPLE
句には以下の構文がサポートされています:
SAMPLE句構文 | 説明 |
---|---|
SAMPLE k | ここでk は0から1の数字です。クエリはデータのk 分の1の割合で実行されます。例えば、SAMPLE 0.1 はデータの10%でクエリを実行します。 詳しく読む |
SAMPLE n | ここでn は十分に大きな整数です。クエリは少なくともn 行のサンプルで実行されます(ただし、これを大幅に越えることはありません)。例えば、SAMPLE 10000000 は最低10,000,000行でクエリを実行します。 詳しく読む |
SAMPLE k OFFSET m | ここでk とm は0から1の数字です。クエリはデータのk 分の1の割合でサンプルを実行します。サンプルに使用されるデータはm の割合でオフセットされます。 詳しく読む |
SAMPLE K
ここでk
は0から1の数字です(分数および小数表記がサポートされています)。例えば、SAMPLE 1/2
またはSAMPLE 0.5
。
SAMPLE k
句では、データのk
分の1からサンプルが取られます。以下に例を示します:
この例では、クエリはデータの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
この例では、サンプルはすべてのデータの10分の1です:
[++------------]
例2
ここでは、データの後半から10%のサンプルを取得しています。
[------++------]