- カテゴリ:
SAMPLE / TABLESAMPLE¶
指定されたテーブルからランダムにサンプリングされた行のサブセットを返します。次のサンプリング方法がサポートされています。
特定の行が含まれる確率を指定して、テーブルの一部をサンプリングします。返される行の数は、テーブルのサイズと要求された確率によって異なります。シードを指定して、サンプリングを決定的にすることができます。
指定された固定数の行をサンプリングします。テーブルに含まれる行が少ない場合を除き、指定された行の正確な数が返されます。
SAMPLE と TABLESAMPLE は同義語であり、同じ意味で使用できます。
構文¶
SELECT ...
FROM ...
{ SAMPLE | TABLESAMPLE } [ samplingMethod ] ( { <probability> | <num> ROWS } ) [ { REPEATABLE | SEED } ( <seed> ) ]
[ ... ]
条件:
samplingMethod ::= { { BERNOULLI | ROW } | { SYSTEM | BLOCK } }
BERNOULLI | ROW
または .SYSTEM | BLOCK
使用するサンプリング方法を指定します。
BERNOULLI
(またはROW
):probability
がp/100
の各行が含まれます。行ごとにおもりが付いたコインを投げるのに似ています。SYSTEM
(またはBLOCK
):probability
がp/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 は異なる結果を生成します。テーブルが変更されず、同じ
seed
とprobability
が指定されている場合、 SAMPLE は同じ結果を生成します。ただし、同じprobability
とseed
が指定されている場合でも、テーブルのコピーでのサンプリングが元のテーブルでのサンプリングと同じ結果を返さない可能性があります。
- 固定サイズ:
テーブルが要求された行数よりも大きい場合、要求された行数が常に返されます。
テーブルが要求された行数よりも小さい場合、テーブル全体が返されます。
SYSTEM | BLOCK
およびseed
は固定サイズのサンプリングについてサポートされていません。たとえば、次のクエリはエラーを生成します。select * from example_table sample system (10 rows); select * from example_table sample row (10 rows) seed (99);
ビューまたはサブクエリでは、
seed
によるサンプリングはサポートされていません。例えば、次のクエリはエラーを生成します。select * from (select * from example_table) sample (1) seed (99);
JOIN
の結果のサンプリングは許可されていますが、次の すべて が当てはまる場合のみです。サンプルは行ベース(Bernoulli)です。
サンプリングはシードを使用しません。
サンプリングは、結合が完全に処理された後に行われます。したがって、サンプリングによって結合される行の数が削減されることはなく、
JOIN
のコストも削減されません。 例 セクションには、JOIN
の結果をサンプリングする例が含まれています。リテラルを使用して
probability | num ROWS
およびseed
を指定することに加えて、セッション変数またはバインド変数も使用できます。
パフォーマンスの考慮事項¶
SYSTEM | BLOCK
多くの場合、サンプリングはBERNOULLI | ROW
サンプリングよりも高速です。多くの場合、
seed
を使用しないサンプリングは、seed
を使用したサンプリングよりも高速です。固定サイズのサンプリングは一部のクエリの最適化を妨げるため、固定サイズのサンプリングは同等の分数ベースのサンプリングよりも遅くなります。
例¶
分数ベースの行サンプリング¶
各行が10%の確率でサンプルに含まれるテーブルのサンプルを返します。
SELECT * FROM testtable SAMPLE (10);
各行が20.3%の確率でサンプルに含まれるテーブルのサンプルを返します。
SELECT * FROM testtable TABLESAMPLE BERNOULLI (20.3);
テーブル内のすべての行を含むテーブル全体を返します。
SELECT * FROM testtable TABLESAMPLE (100);
空のサンプルを返します。
SELECT * FROM testtable SAMPLE ROW (0);
この例は、結合で複数のテーブルをサンプリングする方法を示しています。
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 ;
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 ;
JOIN
の個々のテーブルではなく、 JOIN
の結果に SAMPLE
句を適用するには、 JOIN
の結果を含むインラインビューに JOIN
を適用します。たとえば、サブクエリとして JOIN
を実行し、サブクエリの結果に SAMPLE を適用します。以下の例は、 JOIN
によって返される行の約1%をサンプリングします。
select * from ( select * from t1 join t2 on t1.a = t2.c ) sample (1);
分数ベースのブロックサンプリング(シード付き)¶
行の各ブロックがサンプルに含まれる確率が3%であるテーブルのサンプルを返し、シードを82に設定します。
SELECT * FROM testtable SAMPLE SYSTEM (3) SEED (82);
行の各ブロックがサンプルに含まれる確率が0.012%であるテーブルのサンプルを返し、シードを99992に設定します。
SELECT * FROM testtable SAMPLE BLOCK (0.012) REPEATABLE (99992);
注釈
テーブルに変更を加えずにこれらのクエリのいずれかを再度実行すると、同じサンプルセットが返されます。
固定サイズの行サンプリング¶
各行に min(1, 10/n)
の確率がサンプルに含まれる10行の固定サイズのサンプルを返します。 n
はテーブル内の行数です。
SELECT * FROM testtable SAMPLE (10 ROWS);