- 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 ] ( { <probability> | <num> ROWS } ) [ { REPEATABLE | SEED } ( <seed> ) ]
[ ... ]
Wobei:
samplingMethod ::= { { BERNOULLI | ROW } | { SYSTEM | BLOCK } }
BERNOULLI | ROW
oder .SYSTEM | BLOCK
Gibt die zu verwendende Samplingmethode an:
BERNOULLI
(oderROW
): Enthält jede Zeile mit einerprobability
vonp/100
. Ähnelt dem Werfen einer gewichteten Münze für jede Zeile.SYSTEM
(oderBLOCK
): Umfasst jeden Zeilenblock mit einerprobability
vonp/100
. Ähnelt dem Werfen einer gewichteten Münze für jeden Zeilenblock. 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.
REPEATABLE | SEED ( seed )
Gibt einen Startwert an, um das Samplingverfahren deterministisch zu gestalten. Kann eine beliebige ganze Zahl zwischen
0
und2147483647
inklusive sein.
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
.Bei
SYSTEM | 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
wird bei 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);
Sampling mit einem
seed
wird in 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 eines
JOIN
ist zulässig, jedoch nur, wenn jede der folgenden Bedingungen erfüllt ist:Die Stichprobe ist zeilenbasiert (Bernoulli).
Beim Sampling wird kein Startwert verwendet.
Das Sampling wird durchgeführt, nachdem der Join vollständig verarbeitet wurde. Daher wird durch das Sampling die Anzahl der verknüpften Zeilen und Kosten für
JOIN
nicht verringert. Der Abschnitt Beispiele enthält ein Beispiel für das Sampling einsJOIN
-Ergebnisses.Zusätzlich zur Verwendung von Literalen zur Angabe von
probability | num ROWS
(Wahrscheinlichkeit) undseed
(Startwert) können auch Sitzungs- oder Bindungsvariablen verwendet werden.
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 kann langsamer sein als äquivalentes bruchbasiertes Sampling, da Sampling mit fester Größe die Abfrageoptimierung zum Teil verhindert.
Beispiele¶
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:
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 ;
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 verknüpft alle Zeilen von t1 mit einer Stichprobe von 50 % der Zeilen in Tabelle2. 50 % der Zeilen, die sich aus dem Verknüpfen aller Zeilen in beiden Tabellen ergeben, werden nicht erfasst:
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 von JOIN
und nicht auf die einzelnen Tabellen in JOIN
anzuwenden, wenden Sie die JOIN
-Operation auf eine Inline-Ansicht an, die das JOIN
-Ergebnis enthält. Führen Sie beispielsweise den JOIN
als Unterabfrage aus, und wenden Sie dann das SAMPLE auf das Ergebnis der Unterabfrage an. Das folgende Beispiel zeigt ungefähr 1 % der von 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);