カテゴリ:

クエリ構文

SAMPLE / TABLESAMPLE

指定されたテーブルからランダムにサンプリングされた行のサブセットを返します。次のサンプリング方法がサポートされています。

  • 特定の行が含まれる確率を指定して、テーブルの一部をサンプリングします。返される行の数は、テーブルのサイズと要求された確率によって異なります。シードを指定して、サンプリングを決定的にすることができます。

  • 指定された固定数の行をサンプリングします。テーブルに含まれる行が少ない場合を除き、指定された行の正確な数が返されます。

SAMPLE と TABLESAMPLE は同義語であり、同じ意味で使用できます。

構文

SELECT ...
FROM ...
  { SAMPLE | TABLESAMPLE } [ samplingMethod ] ( { <probability> | <num> ROWS } ) [ { REPEATABLE | SEED } ( <seed> ) ]
[ ... ]
Copy

条件:

samplingMethod ::= { { BERNOULLI | ROW } |
                     { SYSTEM | BLOCK } }
Copy
BERNOULLI | ROW または . SYSTEM | BLOCK

使用するサンプリング方法を指定します。

  • BERNOULLI (または ROW): probabilityp/100 の各行が含まれます。行ごとにおもりが付いたコインを投げるのに似ています。

  • SYSTEM (または BLOCK): probabilityp/100 の行の各ブロックが含まれます。行のブロックごとにおもりが付いたコインを投げるのに似ています。このメソッドは、固定サイズのサンプリングをサポートしていません。

サンプリング方法はオプションです。メソッドが指定されていない場合、デフォルトは BERNOULLI です。

probability または . num ROWS

テーブルの一部に基づいてサンプリングするか、テーブルの行の固定数に基づいてサンプリングするかを指定します。条件:

  • probability は、サンプルの選択に使用する確率のパーセンテージを指定します。 0 (行が選択されていない)から 100 (すべての行が選択されている)までの10進数を指定できます。

  • num は、テーブルからサンプリングする行の数(最大1、000、000)を指定します。 0 (行が選択されていない)から 1000000 までの任意の整数を指定できます。

REPEATABLE | SEED ( seed )

サンプリングを決定的にするシード値を指定します。 0 から 2147483647 までの任意の整数を指定できます。

使用上の注意

  • 次のキーワードは同じ意味で使用できます。

    • SAMPLE | TABLESAMPLE

    • BERNOULLI | ROW

    • SYSTEM | BLOCK

    • REPEATABLE | SEED

  • 返される行の数は、指定されたサンプリング方法によって異なります。

    分数ベース:
    • BERNOULLI | ROW サンプリングの場合、返される行の予想数は (p/100)*n です。

    • SYSTEM | BLOCK サンプリング、特に小さなテーブルの場合、サンプルにバイアスがかかる場合があります。

    注釈

    非常に大きなテーブルの場合、2つの方法の違いはごくわずかです。

    また、サンプリングは確率的なプロセスであるため、返される行の数は (p/100)*n 行と正確には等しくありませんが、近い値になります。

    • seed が指定されていない場合、同じクエリが繰り返されると SAMPLE は異なる結果を生成します。

    • テーブルが変更されず、同じ seedprobability が指定されている場合、 SAMPLE は同じ結果を生成します。ただし、同じ probabilityseed が指定されている場合でも、テーブルのコピーでのサンプリングが元のテーブルでのサンプリングと同じ結果を返さない可能性があります。

    固定サイズ:
    • テーブルが要求された行数よりも大きい場合、要求された行数が常に返されます。

    • テーブルが要求された行数よりも小さい場合、テーブル全体が返されます。

    • SYSTEM | BLOCK および seed は固定サイズのサンプリングについてサポートされていません。たとえば、次のクエリはエラーを生成します。

      select * from example_table sample system (10 rows);
      
      select * from example_table sample row (10 rows) seed (99);
      
      Copy
  • ビューまたはサブクエリでは、 seed によるサンプリングはサポートされていません。例えば、次のクエリはエラーを生成します。

    select * from (select * from example_table) sample (1) seed (99);
    
    Copy
  • JOIN の結果のサンプリングは許可されていますが、次の すべて が当てはまる場合のみです。

    • サンプルは行ベース(Bernoulli)です。

    • サンプリングはシードを使用しません。

    サンプリングは、結合が完全に処理された後に行われます。したがって、サンプリングによって結合される行の数が削減されることはなく、 JOIN のコストも削減されません。 セクションには、 JOIN の結果をサンプリングする例が含まれています。

  • リテラルを使用して probability | num ROWS および seed を指定することに加えて、セッション変数またはバインド変数も使用できます。

パフォーマンスの考慮事項

  • SYSTEM | BLOCK 多くの場合、サンプリングは BERNOULLI | ROW サンプリングよりも高速です。

  • 多くの場合、 seed を使用しないサンプリングは、 seed を使用したサンプリングよりも高速です。

  • 固定サイズのサンプリングは一部のクエリの最適化を妨げるため、固定サイズのサンプリングは同等の分数ベースのサンプリングよりも遅くなります。

分数ベースの行サンプリング

各行が10%の確率でサンプルに含まれるテーブルのサンプルを返します。

SELECT * FROM testtable SAMPLE (10);
Copy

各行が20.3%の確率でサンプルに含まれるテーブルのサンプルを返します。

SELECT * FROM testtable TABLESAMPLE BERNOULLI (20.3);
Copy

テーブル内のすべての行を含むテーブル全体を返します。

SELECT * FROM testtable TABLESAMPLE (100);
Copy

空のサンプルを返します。

SELECT * FROM testtable SAMPLE ROW (0);
Copy

この例は、結合で複数のテーブルをサンプリングする方法を示しています。

SELECT i, j
    FROM
         table1 AS t1 SAMPLE (25)     -- 25% of rows in table1
             INNER JOIN
         table2 AS t2 SAMPLE (50)     -- 50% of rows in table2
    WHERE t2.j = t1.i
    ;
Copy

SAMPLE 句は1つのテーブルのみに適用され、先行するすべてのテーブルまたは SAMPLE 句の前の式全体には適用されません。次の JOIN 操作は、t1のすべての行を、テーブル2の行の50%のサンプルに結合します。両方のテーブルのすべての行を結合した結果、行の50%をサンプリングしません。

SELECT i, j
    FROM table1 AS t1 INNER JOIN table2 AS t2 SAMPLE (50)
    WHERE t2.j = t1.i
    ;
Copy

JOIN の個々のテーブルではなく、 JOIN の結果に SAMPLE 句を適用するには、 JOIN の結果を含むインラインビューに JOIN を適用します。たとえば、サブクエリとして JOIN を実行し、サブクエリの結果に SAMPLE を適用します。以下の例は、 JOIN によって返される行の約1%をサンプリングします。

select *
   from (
         select *
            from t1 join t2
               on t1.a = t2.c
        ) sample (1);
Copy

分数ベースのブロックサンプリング(シード付き)

行の各ブロックがサンプルに含まれる確率が3%であるテーブルのサンプルを返し、シードを82に設定します。

SELECT * FROM testtable SAMPLE SYSTEM (3) SEED (82);
Copy

行の各ブロックがサンプルに含まれる確率が0.012%であるテーブルのサンプルを返し、シードを99992に設定します。

SELECT * FROM testtable SAMPLE BLOCK (0.012) REPEATABLE (99992);
Copy

注釈

テーブルに変更を加えずにこれらのクエリのいずれかを再度実行すると、同じサンプルセットが返されます。

固定サイズの行サンプリング

各行に min(1, 10/n) の確率がサンプルに含まれる10行の固定サイズのサンプルを返します。 n はテーブル内の行数です。

SELECT * FROM testtable SAMPLE (10 ROWS);
Copy