Tabellenstichproben

Mit Tabellenstichproben können Sie zufällige Teilmengen von Daten aus großen BigQuery-Tabellen abfragen. Sampling gibt eine Vielzahl von Datensätzen zurück und vermeidet gleichzeitig die Kosten für das Scannen und Verarbeiten einer gesamten Tabelle.

Tabellenstichproben verwenden

Wenn Sie in einer Abfrage Tabellenstichproben verwenden möchten, fügen Sie die Klausel TABLESAMPLE ein. Beispiel: Die folgende Abfrage wählt etwa 10% der Daten einer Tabelle aus:

SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (10 PERCENT)

Anders als die LIMIT-Klausel gibt TABLESAMPLE eine zufällige Teilmenge von Daten aus einer Tabelle zurück. Darüber hinaus speichert BigQuery die Ergebnisse von Abfragen, die eine TABLESAMPLE-Klausel enthalten, nicht im Cache. Daher kann die Abfrage jedes Mal andere Ergebnisse zurückgeben.

Sie können die TABLESAMPLE-Klausel mit anderen Auswahlbedingungen kombinieren. Im folgenden Beispiel werden etwa 50% der Tabelle dargestellt und anschließend eine WHERE-Klausel angewendet:

SELECT *
FROM dataset.my_table TABLESAMPLE SYSTEM (50 PERCENT)
WHERE customer_id = 1

Im nächsten Beispiel wird eine TABLESAMPLE-Klausel mit einer JOIN-Klausel kombiniert:

SELECT *
FROM dataset.table1 T1 TABLESAMPLE SYSTEM (10 PERCENT)
JOIN dataset.table2 T2 TABLESAMPLE SYSTEM (20 PERCENT) USING (customer_id)

Bei kleineren Tabellen gilt: Wenn Sie zwei Stichproben zusammenführen und keine der Stichprobenzeilen der Join-Bedingung entspricht, wird ein leeres Ergebnis zurückgegeben.

Sie können den Prozentsatz als Abfrageparameter angeben. Im nächsten Beispiel wird gezeigt, wie Sie den Prozentsatz mit dem bq-Befehlszeilentool an eine Abfrage übergeben:

bq query --use_legacy_sql=false --parameter=percent:INT64:29 \
    'SELECT * FROM `dataset.my_table` TABLESAMPLE SYSTEM (@percent PERCENT)`

BigQuery-Tabellen sind in Datenblöcken organisiert. Die TABLESAMPLE-Klausel wählt nach dem Zufallsprinzip einen Prozentsatz der Datenblöcke aus der Tabelle aus und liest alle Zeilen in den ausgewählten Blöcken. Die Stichprobengranularität ist durch die Anzahl der Datenblöcke beschränkt.

Normalerweise teilt BigQuery Tabellen oder Tabellenpartitionen in Blöcke auf, wenn diese größer als 1 GB sind. Kleinere Tabellen können aus einem einzelnen Datenblock bestehen. In diesem Fall liest die TABLESAMPLE-Klausel die gesamte Tabelle. Wenn der Stichprobenprozentsatz größer null ist und die Tabelle nicht leer ist, gibt die Tabellenstichprobe immer Ergebnisse zurück.

Blöcke können unterschiedliche Größen haben. Daher kann der genaue Anteil der Zeilen, die als Stichprobe genommen werden, variieren. Wenn Sie anstelle von Datenblöcken einzelne Zeilen stichprobenartig testen möchten, können Sie stattdessen eine WHERE rand() < K-Klausel verwenden. Bei diesem Ansatz muss BigQuery jedoch die gesamte Tabelle scannen. Sie können beide Techniken kombinieren, um Kosten zu sparen, aber gleichzeitig von den Stichproben auf Zeilenebene zu profitieren.

Im folgenden Beispiel werden etwa 20% der Datenblöcke aus dem Speicher gelesen. Daraufhin werden nach dem Zufallsprinzip 10% der Zeilen in diesen Blöcken ausgewählt:

SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (20 PERCENT)
WHERE rand() < 0.1

Externe Tabellen

Sie können die TABLESAMPLE-Klausel mit externen Tabellen verwenden, die Daten in einer Sammlung von Dateien speichern. In BigQuery wird eine Teilmenge der externen Dateien abgerufen, auf die die Tabelle verweist. Bei einigen Dateiformaten kann BigQuery einzelne Dateien für das Sampling in Blöcke aufteilen. Einige externe Daten, z. B. Daten in Google Tabellen, bestehen aus einer einzelnen Datei, die als ein Datenblock erfasst wird.

Stichproben aus dem schreiboptimierten Speicher

Wenn Sie Tabellenstichproben mit Streaming-Insert-Anweisungen verwenden, führt BigQuery Stichproben aus dem schreiboptimierten Speicher aus. In einigen Fällen werden alle Daten im schreiboptimierten Speicher als ein einzelner Block dargestellt. In diesem Fall werden entweder alle Daten des schreiboptimierten Speichers in den Ergebnissen angezeigt oder gar keine Daten.

Partitionierte und geclusterte Tabellen

Partitionierung und Clustering erzeugen Blöcke, bei denen alle Zeilen in einem bestimmten Block entweder den gleichen Partitionierungsschlüssel oder Clustering-Attribute mit ähnlichen Werten haben. Daher sind die Beispielsätze aus diesen Tabellen in der Regel verzerrter als Stichproben von nicht partitionierten Tabellen.

Beschränkungen

  • Eine Stichprobentabelle kann in einer Abfrageanweisung nur einmal vorhanden sein. Diese Einschränkung umfasst Tabellen, auf die in Ansichtsdefinitionen verwiesen wird.
  • Stichprobendaten aus Ansichten werden nicht unterstützt.
  • Das Sampling von Ergebnissen von Unterabfragen oder Funktionsaufrufen mit Tabellenwerten wird nicht unterstützt.
  • Stichproben werden nicht innerhalb einer IN-Unterabfrage unterstützt.
  • Stichproben aus Tabellen mit angewendeter Sicherheit auf Zeilenebene werden nicht unterstützt.

Preise für Tabellenproben

Wenn Sie die On-Demand-Abrechnung nutzen, werden Ihnen die Kosten für das Lesen der Daten in Rechnung gestellt. BigQuery speichert die Ergebnisse einer Abfrage, die eine TABLESAMPLE-Klausel enthält, nicht im Cache, sodass bei jeder Ausführung die Kosten für das Lesen der Daten aus dem Speicher anfallen.