SAMPLE句
SAMPLE
句は、おおよその SELECT
クエリ処理を可能にします。
データサンプリングが有効になっている場合、クエリはすべてのデータではなく、特定のデータの断片(サンプル)のみに対して実行されます。たとえば、すべての訪問の統計を計算する必要がある場合、訪問の10分の1でクエリを実行し、結果を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%のサンプルが取得されます。
[------++------]