メインコンテンツへスキップ
メインコンテンツへスキップ

SAMPLE 句

SAMPLE 句は、近似的な SELECT クエリの実行を可能にします。

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

近似クエリ処理は、次のような場合に有用です。

  • 厳格なレイテンシ要件(100ms 未満など)がある一方で、それを満たすために追加のハードウェアリソースのコストを正当化できない場合。
  • 生データがそもそも正確でないため、近似しても品質が目立って低下しない場合。
  • ビジネス要件として、(費用対効果の観点や、正確な結果をプレミアムユーザー向けとして提供するなどの理由で)おおよその結果で十分とされている場合。
注記

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

データサンプリングの特徴は次のとおりです。

  • データサンプリングは決定的なメカニズムです。同じ SELECT .. SAMPLE クエリの結果は常に同じになります。
  • サンプリングは、異なるテーブル間でも一貫して動作します。サンプリングキーが 1 つだけのテーブルでは、同じ係数のサンプルは常に同じ部分集合のデータを選択します。たとえば、ユーザー ID のサンプルでは、異なるテーブルからでも、取りうるすべてのユーザー ID のうち同じ部分集合の行が取得されます。これは、IN 句内のサブクエリでサンプルを使用できることを意味します。また、JOIN 句を使ってサンプル同士を結合することもできます。
  • サンプリングを使用すると、ディスクから読み取るデータ量を減らすことができます。ただし、サンプリングキーを正しく指定する必要があります。詳細は、MergeTree テーブルの作成 を参照してください。

SAMPLE 句には、次の構文がサポートされています。

SAMPLE Clause SyntaxDescription
SAMPLE kここで k は 0 から 1 までの数値です。クエリはデータの k の割合に対して実行されます。たとえば、SAMPLE 0.1 はデータの 10% に対してクエリを実行します。 詳細
SAMPLE nここで n は十分に大きな整数です。クエリは少なくとも n 行(ただし、それを大きく超えない)のサンプルに対して実行されます。たとえば、SAMPLE 10000000 は最小で 10,000,000 行に対してクエリを実行します。 詳細
SAMPLE k OFFSET mここで km は 0 から 1 までの数値です。クエリはデータの k の割合のサンプルに対して実行されます。サンプルに使用されるデータは、m の割合だけオフセットされます。 詳細

SAMPLE K

ここで k は 0 以上 1 以下の数値です(分数表記と小数表記の両方がサポートされています)。例えば、SAMPLE 1/2SAMPLE 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.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 テーブルを考えます。最初の例では、ページビュー数の計算方法を示します。

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

ここで km は 0 から 1 までの数値です。以下に例を示します。

例 1

SAMPLE 1/10

この例では、サンプリング対象は全データの 1/10 です:

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

例 2

SAMPLE 1/10 OFFSET 1/2

ここでは、データの後半部分から 10% のサンプルを取得します。

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