- カテゴリ:
SAMPLE / TABLESAMPLE¶
指定されたテーブルからランダムにサンプリングされた行のサブセットを返します。さまざまなタイプのサンプリング方法を指定でき、テーブルの一部または固定行数をサンプルできます。
特定の行を含めるための指定された確率でテーブルの一部をサンプルする場合、返される行数はテーブルのサイズと要求された確率によって異なります。シードを指定して、サンプリングを決定論的にすることができます。
固定された指定行数をサンプルした場合、クエリは、テーブルに含まれる行数がより少ない場合を除き、指定された行数を正確に返します。
SAMPLE と TABLESAMPLE は同義語であり、同じ意味で使用できます。
構文¶
条件:
パラメーター¶
{ 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までの任意の整数を指定できます。
リテラルを使用して
probabilityまたはnum ROWSを指定することに加えて、セッション変数またはバインド変数も使用できます。{ REPEATABLE | SEED ( seed ) }サンプリングを決定的にするシード値を指定します。
0から2147483647までの任意の整数を指定できます。このパラメータはSYSTEMとBLOCKのサンプリングにのみ適用されます。リテラルを使用して
seedを指定することに加えて、セッション変数またはバインド変数も使用できます。
使用上の注意¶
次のキーワードは同じ意味で使用できます。
SAMPLEおよびTABLESAMPLEBERNOULLIおよびROWSYSTEMおよびBLOCKREPEATABLEおよびSEED
返される行の数は、指定されたサンプリング方法と、サンプルのベースがテーブルの一部であるかテーブルの固定行数であるかによって異なります。
- 分数ベース:
:code:`BERNOULLI`または:code:`ROW`サンプリングの場合、返される行の予想数は``(p/100)*n``です。:code:`SYSTEM`または:code:`BLOCK`サンプリングの場合、特に小さなテーブルではサンプルにバイアスがかかる可能性があります。
注釈
非常に大きなテーブルの場合、2つの方法の違いはごくわずかです。
また、サンプルは確率的な処理であるため、返される行の数は
(p/100)*n行と完全に等しいわけではありませんが、この値に近くなります。seedが指定されていない場合、同じクエリが繰り返されると SAMPLE は異なる結果を生成します。テーブルが変更されず、同じ
seedとprobabilityが指定された場合、SAMPLE は同じ結果を生成します。ただし、同じprobabilityとseedが指定されている場合でも、テーブルのコピーでのサンプリングが元のテーブルでのサンプリングと同じ結果を返さない可能性があります。
- 固定サイズ:
テーブルが要求された行数よりも大きい場合、要求された行数が常に返されます。
テーブルが要求された行数よりも小さい場合、テーブル全体が返されます。
:code:`SYSTEM`または:code:`BLOCK`サンプリングを使用する場合、Snowflakeは個々の行ではなく、ストレージレベルの単位でデータをサンプリングします。ほとんどの場合、ブロックは単一のマイクロパーティションに対応します。
比較的少ないマイクロパーティションを持つ非常に小さなテーブルの場合、サンプリングは完全なマイクロパーティションよりも細かい粒度で動作します。このような場合、ブロックはマイクロパーティションにまたがる可能性のある行のサブセットを表します。その結果、テーブルに含まれるマイクロパーティションが少数の場合でも、返されるサンプルは要求された割合をより厳密に反映します。
固定サイズのサンプリングでは、
SYSTEM、BLOCK、および:samp:`SEED ({seed})`はサポートされていません。たとえば、次のクエリはエラーを生成します。
ビューまたはサブクエリでは、
SEED (seed)によるサンプリングはサポートされていません。例えば、次のクエリはエラーを生成します。結合結果のサンプリングは許可されていますが、次の 両方 が当てはまる場合のみです。
サンプリングは行ベース(Bernoulli)です。
サンプリングはシードを使用しません。
サンプリングは、結合が完全に処理された後に行われます。したがって、サンプリングによって結合する行数が減ることも、結合のコストが減ることもありません。例 セクションには、結合結果をサンプリングする例が含まれています。
LIMIT 句も SAMPLE 句も、テーブルから行のサブセットを返します。LIMIT 句を使用すると、Snowflakeは指定された行数を可能な限りすばやい方法で返します。SAMPLE 句を使用すると、Snowflakeは句に指定されたサンプリング方法で、行を返します。
パフォーマンスの考慮事項¶
例¶
以下の例では、 SAMPLE 句を使用しています。
分数ベースの行サンプリング¶
各行が10%の確率でサンプルに含まれるテーブルのサンプルを返します。
各行が20.3%の確率でサンプルに含まれるテーブルのサンプルを返します。
テーブル内のすべての行を含むテーブル全体を返します。
空のサンプルを返します。
結合によるサンプリング¶
この例は、結合で複数のテーブルをサンプリングする方法を示しています。table1 の行の25%、 table2 の行の50%をサンプリングしています:
SAMPLE 句は1つのテーブルのみに適用され、先行するすべてのテーブルまたは SAMPLE 句の前の式全体には適用されません。次の JOIN 操作は、 table1 のすべての行を結合して、 table2 の50%の行をサンプリングしています。両方のテーブルのすべての行を結合した結果の50%の行をサンプリングしているのではありません:
結合した個々のテーブルではなく、結合の結果に SAMPLE 句を適用するには、結合の結果を含むインラインビューに結合を適用します。たとえば、サブクエリとして結合を実行し、サブクエリの結果に SAMPLE を適用します。以下の例は、結合によって返される行の約1%をサンプリングします。
分数ベースのブロックサンプリング(シード付き)¶
行の各ブロックがサンプルに含まれる確率が3%であるテーブルのサンプルを返し、シードを82に設定します。
行の各ブロックがサンプルに含まれる確率が0.012%であるテーブルのサンプルを返し、シードを99992に設定します。
注釈
テーブルに変更を加えずにこれらのクエリのいずれかを再度実行すると、同じサンプルセットが返されます。
固定サイズの行サンプリング¶
各行に min(1, 10/n) の確率がサンプルに含まれる10行の固定サイズのサンプルを返します。n はテーブル内の行数です。