Kategorien:

Abfragesyntax

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 ]
[ ... ]
Copy

Wobei:

samplingMethod ::= { { BERNOULLI | ROW } ( { <probability> | <num> ROWS } ) |
                     { SYSTEM | BLOCK } ( <probability> ) [ { REPEATABLE | SEED } ( <seed> ) ] }
Copy

Parameter

{ BERNOULLI | ROW } oder . { SYSTEM | BLOCK }

Gibt die zu verwendende Samplingmethode an:

  • BERNOULLI (oder ROW): Enthält jede Zeile mit einer probability von p/100. Diese Methode ist vergleichbar mit dem Werfen einer gewichteten Münze für jede Zeile.

  • SYSTEM (oder BLOCK): Beinhaltet jeden Block von Zeilen mit einer probability von p/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 zwischen 0 (keine Zeilen ausgewählt) und 100 (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 zwischen 0 (keine Zeilen ausgewählt) und 1000000 inklusive sein.

Neben der Verwendung von Literalen zur Angabe von probability oder num 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 und 2147483647 inklusive sein. Dieser Parameter gilt nur für das SYSTEM- und BLOCK-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. 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) und probability (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ür probability (Wahrscheinlichkeit) und seed (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 und SEED (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);
      
      Copy
  • 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);
    
    Copy
  • 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 das BERNOULLI | ROW-Sampling.

  • Sampling ohne seed (Startwert) wird oft schneller ausgeführt als Sampling mit seed (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);
Copy

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);
Copy

Gibt eine komplette Tabelle zurück, einschließlich aller Zeilen in der Tabelle:

SELECT * FROM testtable TABLESAMPLE (100);
Copy

Gibt eine leere Stichprobe zurück:

SELECT * FROM testtable SAMPLE ROW (0);
Copy

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;
Copy

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;
Copy

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);
Copy

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);
Copy

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);
Copy

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);
Copy