ClickHouse/docs/ja/sql-reference/statements/select/sample.md
2024-11-18 11:58:58 +09:00

7.2 KiB
Raw Blame History

slug sidebar_label
/ja/sql-reference/statements/select/sample SAMPLE

SAMPLE句

SAMPLE句は、近似のSELECTクエリ処理を可能にします。

データサンプリングが有効になっている場合、クエリはすべてのデータに対して実行されるのではなく、データの一部サンプルのみに対して実行されます。例えば、すべての訪問の統計を計算する必要がある場合、すべての訪問の10分の1のデータに対してクエリを実行し、その結果を10倍するだけで十分です。

近似クエリ処理が有用なケースは以下の通りです:

  • 厳格なレイテンシ要件例えば100ms未満があるが、これを満たすための追加のハードウェアリソースのコストを正当化できない場合。
  • 生データが正確でないので、近似が品質を明らかに劣化させることはない場合。
  • ビジネス要件が近似結果を目標としている場合(コスト効果のため、または正確な結果をプレミアムユーザーに提供するため)。

:::note
サンプリングは、MergeTreeファミリーのテーブルでのみ使用でき、テーブル作成時にサンプリング式が指定された場合のみ使用できます(MergeTreeエンジンを参照)。 :::

データサンプリングの特長は以下の通りです:

  • データサンプリングは決定的なメカニズムです。同じ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部分のサンプルからデータを抽出します。以下に例を示します:

SELECT
    Title,
    count() * 10 AS PageViews
FROM hits_distributed
SAMPLE 0.1
WHERE
    CounterID = 34
GROUP BY Title
ORDER BY PageViews DESC LIMIT 1000

この例では、クエリはデータの0.110%)のサンプルで実行されます。集計関数の値は自動的に補正されないため、近似結果を得るには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を考えます。最初の例はページビュー数を計算する方法を示しています:

SELECT sum(PageViews * _sample_factor)
FROM visits
SAMPLE 10000000

次の例は、訪問の総数を計算する方法を示しています:

SELECT sum(_sample_factor)
FROM visits
SAMPLE 10000000

以下の例は、セッションの平均継続時間を計算する方法を示しています。平均値を計算するには、相対的係数を使用する必要はありません。

SELECT avg(Duration)
FROM visits
SAMPLE 10000000

SAMPLE K OFFSET M

ここでkおよびmは0から1の数字です。以下に例を示します。

例 1

SAMPLE 1/10

この例では、すべてのデータの1/10のサンプルです

[++------------]

例 2

SAMPLE 1/10 OFFSET 1/2

ここで、データの後半から10%のサンプルが取られます。

[------++------]