- Kategorien:
SAMPLE / TABLESAMPLE¶
Gibt eine Teilmenge von Zeilen zurück, die aus der angegebenen Tabelle zufällig gesampelt wurden. Folgende Samplingmethoden werden unterstützt:
Sampeln eines Teils einer Tabelle mit einer bestimmten Wahrscheinlichkeit für das Einschließen einer bestimmten Zeile. Die Anzahl der zurückgegebenen Zeilen hängt von der Größe der Tabelle und der gewünschten Wahrscheinlichkeit ab. Es kann ein Startwert spezifiziert werden, um das Sampling deterministisch zu gestalten.
Sampeln einer festen, spezifischen Anzahl von Zeilen. Die genaue Anzahl der angegebenen Zeilen wird zurückgegeben, es sei denn, die Tabelle enthält weniger Zeilen.
SAMPLE und TABLESAMPLE sind synonym und können austauschbar verwendet werden.
Syntax¶
SELECT ...
FROM ...
{ SAMPLE | TABLESAMPLE } [ samplingMethod ]
[ ... ]
Wobei:
samplingMethod ::= { { BERNOULLI | ROW } ( { <probability> | <num> ROWS } ) | { SYSTEM | BLOCK } ( <probability> ) [ { REPEATABLE | SEED } ( <seed> ) ] }
Parameter¶
{ BERNOULLI | ROW }
oder .{ SYSTEM | BLOCK }
Gibt die zu verwendende Samplingmethode an:
BERNOULLI
(oderROW
): Enthält jede Zeile mit einerprobability
vonp/100
. Diese Methode ist vergleichbar mit dem Werfen einer gewichteten Münze für jede Zeile.SYSTEM
(oderBLOCK
): Beinhaltet jeden Block von Zeilen mit einerprobability
vonp/100
. Diese Methode ist vergleichbar mit dem Werfen einer gewichteten Münze für jeden Block von Zeilen. Diese Methode unterstützt keine Sampling mit fester Größe.
Die Samplingmethode ist optional. Wenn keine Methode angegeben ist, lautet der Standardwert
BERNOULLI
.probability
oder .num ROWS
Gibt an, ob das Sampling für einen Teil der Tabelle oder eine feste Anzahl von Zeilen in der Tabelle ausgeführt werden soll, wobei gilt:
probability
gibt die prozentuale Wahrscheinlichkeit für die Auswahl der Stichprobe an. Es kann sich um eine beliebige Dezimalzahl zwischen0
(keine Zeilen ausgewählt) und100
(alle Zeilen ausgewählt) inklusive handeln.num
gibt die Anzahl der Zeilen (bis zu 1.000.000) an, die aus der Tabelle in die Stichprobe aufgenommen werden sollen. Kann eine beliebige ganze Zahl zwischen0
(keine Zeilen ausgewählt) und1000000
inklusive sein.
Neben der Verwendung von Literalen zur Angabe von
probability
odernum ROWS
können Sie auch Sitzungs- oder Bindungsvariablen verwenden.{ REPEATABLE | SEED ( seed ) }
Gibt einen Startwert an, um das Samplingverfahren deterministisch zu gestalten. Kann eine beliebige ganze Zahl zwischen
0
und2147483647
inklusive sein. Dieser Parameter gilt nur für dasSYSTEM
- undBLOCK
-Sampling.Neben der Verwendung von Literalen zur Angabe von
seed
können Sie auch Sitzungs- oder Bindungsvariablen verwenden.
Nutzungshinweise¶
Die folgenden Schlüsselwörter können austauschbar verwendet werden:
SAMPLE | TABLESAMPLE
BERNOULLI | ROW
SYSTEM | BLOCK
REPEATABLE | SEED
Die Anzahl der zurückgegebenen Zeilen hängt von der angegebenen Samplingmethode ab:
- Bruchbasiert:
Bei
BERNOULLI | ROW
-Sampling ist die erwartete Anzahl der zurückgegebenen Zeilen gleich(p/100)*n
. BeiSYSTEM | BLOCK
-Sampling kann die Stichprobe verzerrt sein, insbesondere bei kleinen Tabellen.Bemerkung
Bei sehr großen Tabellen sollte der Unterschied zwischen den beiden Methoden vernachlässigbar sein.
Da Sampling ein probabilistischer Prozess ist, ist die Anzahl der zurückgegebenen Zeilen nicht genau gleich
(p/100)*n
Zeilen, nähert sich dem Wert aber an.Wenn
seed
angegeben ist, generiert SAMPLE bei Wiederholung der gleichen Abfrage andere Ergebnisse.Wenn sich eine Tabelle nicht ändert und die gleichen Werte für
seed
(Startwert) undprobability
(Wahrscheinlichkeit) angegeben sind, generiert SAMPLE dasselbe Ergebnis. Das Sampling auf der Kopie einer Tabelle liefert möglicherweise jedoch nicht das gleiche Ergebnis wie das Sampling für die Originaltabelle, auch wenn die gleichen Werte fürprobability
(Wahrscheinlichkeit) undseed
(Startwert) angegeben sind.
- Feste Größe:
Wenn die Tabelle größer ist als die angeforderte Anzahl von Zeilen, wird immer die Anzahl der angeforderten Zeilen zurückgegeben.
Wenn die Tabelle kleiner ist als die angeforderte Anzahl von Zeilen, wird die gesamte Tabelle zurückgegeben.
SYSTEM | BLOCK
undSEED (seed)
werden für Sampling mit fester Größe nicht unterstützt. Beispielsweise führen folgende Abfragen zu Fehlern:SELECT * FROM example_table SAMPLE SYSTEM (10 ROWS); SELECT * FROM example_table SAMPLE ROW (10 ROWS) SEED (99);
Unterabfrage Sampling mit
SEED (seed)
wird für Ansichten oder Unterabfragen nicht unterstützt. Beispielsweise erzeugt die folgende Abfrage einen Fehler:SELECT * FROM (SELECT * FROM example_table) SAMPLE (1) SEED (99);
Sampling des Ergebnisses einer Verknüpfung ist zulässig, aber nur, wenn alle der folgenden Punkte zutreffen:
Die Stichprobe ist zeilenbasiert (Bernoulli).
Beim Sampling wird kein Startwert verwendet.
Das Sampling wird durchgeführt, nachdem der Join vollständig verarbeitet wurde. Daher werden durch das Sampling die Anzahl der verknüpften Zeilen und die Kosten für die Verknüpfung nicht verringert. Der Abschnitt Beispiele enthält ein Beispiel für das Sampling des Ergebnisses einer Verknüpfung.
Sowohl die LIMIT-Klausel als auch die SAMPLE-Klausel geben eine Teilmenge von Zeilen aus einer Tabelle zurück. Wenn Sie die LIMIT-Klausel verwenden, gibt Snowflake die angegebene Anzahl von Zeilen auf schnellstmögliche Weise zurück. Wenn Sie die SAMPLE-Klausel verwenden, gibt Snowflake Zeilen auf der Grundlage der in der Klausel angegebenen Samplingmethode zurück.
Hinweise zur Performance¶
Das
SYSTEM | BLOCK
-Sampling ist oft schneller als dasBERNOULLI | ROW
-Sampling.Sampling ohne
seed
(Startwert) wird oft schneller ausgeführt als Sampling mitseed
(Startwert).Sampling mit fester Größe könnte langsamer sein als äquivalentes bruchbasiertes Sampling, da Sampling mit fester Größe die Abfrageoptimierung zum Teil verhindert.
Beispiele¶
Die folgenden Beispiele verwenden die SAMPLE-Klausel.
Bruchbasiertes Zeilensampling¶
Gibt eine Stichprobe einer Tabelle zurück, in der jede Zeile eine Wahrscheinlichkeit von 10 % hat, in die Stichprobe aufgenommen zu werden:
SELECT * FROM testtable SAMPLE (10);
Gibt eine Stichprobe einer Tabelle zurück, in der jede Zeile eine Wahrscheinlichkeit von 20,3 % hat, in die Stichprobe aufgenommen zu werden:
SELECT * FROM testtable TABLESAMPLE BERNOULLI (20.3);
Gibt eine komplette Tabelle zurück, einschließlich aller Zeilen in der Tabelle:
SELECT * FROM testtable TABLESAMPLE (100);
Gibt eine leere Stichprobe zurück:
SELECT * FROM testtable SAMPLE ROW (0);
In diesem Beispiel wird gezeigt, wie das Sampling von mehrere Tabellen in einem Join funktioniert: Es wird ein Sampling von 25 % der Zeilen in table1
und 50 % der Zeilen in table2
durchgeführt:
SELECT i, j
FROM
table1 AS t1 SAMPLE (25)
INNER JOIN
table2 AS t2 SAMPLE (50)
WHERE t2.j = t1.i;
Die SAMPLE
-Klausel gilt nur für eine Tabelle, nicht für alle vorhergehenden Tabellen oder den gesamten Ausdruck vor der SAMPLE
-Klausel. Die folgende JOIN
-Operation verbindet alle Zeilen von table1
mit einem Beispiel von 50 % der Zeilen in table2
. Das Sampling wird nicht auf 50 % der Zeilen, die sich aus der Verknüpfung aller Zeilen in beiden Tabellen ergeben, durchgeführt:
SELECT i, j
FROM table1 AS t1 INNER JOIN table2 AS t2 SAMPLE (50)
WHERE t2.j = t1.i;
Um die SAMPLE
-Klausel auf das Ergebnis eines Joins und nicht auf die einzelnen Tabellen im Join anzuwenden, wenden Sie die Join-Operation auf eine Inline-Ansicht an, die das Ergebnis des Joins enthält. Führen Sie zum Beispiel die Verknüpfung als Unterabfrage durch und wenden Sie dann SAMPLE auf das Ergebnis der Unterabfrage an. Das folgende Beispiel zeigt etwa 1 % der vom Join zurückgegebenen Zeilen:
SELECT *
FROM (
SELECT *
FROM t1 JOIN t2
ON t1.a = t2.c
) SAMPLE (1);
Bruchbasiertes Blocksampling (mit Startwert)¶
Gibt eine Stichprobe einer Tabelle zurück, in der jeder Zeilenblock eine Wahrscheinlichkeit von 3 % hat, in die Stichprobe aufgenommen zu werden, und setzt den Startwert auf 82:
SELECT * FROM testtable SAMPLE SYSTEM (3) SEED (82);
Gibt eine Stichprobe einer Tabelle zurück, in der jeder Zeilenblock eine Wahrscheinlichkeit von 0,012 % hat, in die Stichprobe aufgenommen zu werden, und setzt den Startwert auf 99992:
SELECT * FROM testtable SAMPLE BLOCK (0.012) REPEATABLE (99992);
Bemerkung
Wenn eine dieser Abfragen erneut ausgeführt wird, ohne dass Änderungen an der Tabelle vorgenommen werden, geben sie die gleiche Stichprobenmenge zurück.
Zeilensampling mit fester Größe¶
Gibt eine Stichprobe fester Größe mit 10 Zeilen zurück, in der jede Zeile eine Wahrscheinlichkeit von min(1, 10/n)
hat, in die Stichprobe aufgenommen zu werden, wobei n
die Anzahl der Zeilen in der Tabelle ist:
SELECT * FROM testtable SAMPLE (10 ROWS);