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 ] ( { <probability> | <num> ROWS } ) [ { REPEATABLE | SEED } ( <seed> ) ]
[ ... ]

Wobei:

samplingMethod ::= { { BERNOULLI | ROW } |
                     { SYSTEM | BLOCK } }
BERNOULLI | ROW oder . SYSTEM | BLOCK

Gibt die zu verwendende Samplingmethode an:

  • BERNOULLI (oder ROW): Enthält jede Zeile mit einer Wahrscheinlichkeit von p/100. Ähnelt dem Werfen einer gewichteten Münze für jede Zeile.

  • SYSTEM (oder BLOCK): Umfasst jeden Zeilenblock mit einer Wahrscheinlichkeit von p/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.

Wahrscheinlichkeit oder . Anzahl 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:

  • Wahrscheinlichkeit 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.

  • Anzahl 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.

REPEATABLE | SEED ( Startwert )

Gibt einen Startwert an, um das Samplingverfahren deterministisch zu gestalten. Kann eine beliebige ganze Zahl zwischen 0 und 2147483647 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 Startwert angegeben ist, generiert SAMPLE bei Wiederholung der gleichen Abfrage andere Ergebnisse.

    • Wenn sich eine Tabelle nicht ändert und die gleichen Werte für Startwert und 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 Wahrscheinlichkeit und 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 Startwert werden 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 Startwert 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 eins JOIN-Ergebnisses.

  • Zusätzlich zur Verwendung von Literalen zur Angabe von Wahrscheinlichkeit | Anzahl ROWS und Startwert können auch Sitzungs- oder Bindungsvariablen verwendet werden.

Hinweise zur Performance

  • Das SYSTEM | BLOCK-Sampling ist oft schneller als das BERNOULLI | ROW-Sampling.

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