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

SAMPLE 句

SAMPLE 句は、SELECT クエリを近似的に処理するためのものです。

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

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

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

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

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

  • データサンプリングは決定的なメカニズムです。同じ SELECT .. SAMPLE クエリの結果は常に同じになります。
  • サンプリングはテーブル間で一貫して動作します。サンプリングキーが 1 つのテーブルについては、同じ係数のサンプルは常に同じ部分集合のデータを選択します。たとえば、ユーザー 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ここで 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

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

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

サンプル 1/10

この例では、サンプルは全データの 1/10 を表します:

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

例 2

SAMPLE 1/10 OFFSET 1/2

ここでは、データの後半から 10% のサンプルを抽出します。

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