Einführung in geclusterte Tabellen

Geclusterte Tabellen sind in BigQuery Tabellen, die eine benutzerdefinierte Sortierreihenfolge für Spalten haben und geclusterte Spalten nutzen. Geclusterte Tabellen können die Abfrageleistung verbessern und die Abfragekosten reduzieren.

In BigQuery ist eine geclusterte Spalte ein benutzerdefiniertes Tabellenattribut, das Speicherblöcke auf Basis der Werte in den geclusterten Spalten sortiert. Die Größe der Speicherblöcke wird individuell an die Größe der Tabelle angepasst. Eine geclusterte Tabelle verwaltet die Sortiereigenschaften im Kontext jedes Vorgangs, der sie ändert. Bei Abfragen, die nach geclusterten Spalten filtern oder aggregieren, werden nur die relevanten Blöcke anhand der geclusterten Spalten anstelle der gesamten Tabelle oder Tabellenpartition gescannt. Daher ist BigQuery möglicherweise nicht in der Lage, die von der Abfrage zu verarbeitenden Byte oder die Abfragekosten genau zu schätzen. Es wird jedoch versuchen, die Gesamtzahl der Byte bei der Ausführung zu reduzieren.

Wenn Sie eine Tabelle mit mehreren Spalten clustern, bestimmt die Spaltenreihenfolge, welche Spalten Vorrang haben, wenn BigQuery die Daten in Speicherblöcken sortiert und gruppiert. Im folgenden Beispiel wird das logische Layout des Blockspeichers einer nicht geclusterten Tabelle mit dem Layout geclusterter Tabellen verglichen, die eine oder mehrere geclusterte Spalten enthalten:

BigQuery sortiert Daten in geclusterten Tabellen, um die Abfrageleistung zu verbessern.

Wenn Sie eine geclusterte Tabelle abfragen, erhalten Sie vor der Abfrageausführung keine genaue Schätzung der Abfragekosten, da die Anzahl der zu scannenden Speicherblöcke vor der Abfrageausführung nicht bekannt ist. Die endgültigen Kosten werden nach Abschluss der Abfrageausführung bestimmt. Sie basieren auf den spezifischen Speicherblöcken, die gescannt wurden.

Wann sollte Clustering verwendet werden?

Clustering befasst sich mit der Art und Weise, wie eine Tabelle gespeichert wird, und ist daher im Allgemeinen eine gute erste Option zur Verbesserung der Abfrageleistung. Daher sollten Sie immer Clustering in Betracht ziehen, da es folgende Vorteile bietet:

  • Wenn Ihre Abfragen häufig nach bestimmten Spalten filtern, beschleunigt Clustering die Abfragen, da die Abfrage nur die Blöcke scannt, die dem Filter entsprechen.
  • Wenn Ihre Abfragen nach Spalten mit vielen unterschiedlichen Werten (hohe Kardinalität) filtern, beschleunigt Clustering diese Abfragen, indem BigQuery detaillierte Metadaten für den Abruf von Eingabedaten bereitstellt.
  • Mit dem Clustering können die zugrunde liegenden Speicherblöcke der Tabelle an die Größe der Tabelle angepasst werden.

Sie können die Tabelle zusätzlich zum Clustering partitionieren. Bei dieser Methode segmentieren Sie die Daten zuerst in Partitionen und gruppieren die Daten dann in jeder Partition nach den Clustering-Spalten. Ziehen Sie dies in folgenden Fällen in Betracht:

  • Sie benötigen eine genaue Schätzung der Abfragekosten, bevor Sie eine Abfrage ausführen. Die Kosten für Abfragen von geclusterten Tabellen können erst nach dem Ausführen der Abfrage bestimmt werden. Die Partitionierung bietet detaillierte Abfragekostenschätzungen, bevor Sie eine Abfrage ausführen.
  • Die Partitionierung führt zu einer durchschnittlichen Partitionsgröße von mindestens 10 GB pro Partition. Durch das Erstellen vieler kleiner Partitionen werden die Metadaten der Tabelle vergrößert, was sich auf die Zugriffszeiten auf die Metadaten bei Abfragen der Tabelle auswirken kann.
  • Sie müssen Ihre Tabelle kontinuierlich aktualisieren, möchten aber dennoch die Vorteile der Preise für langfristige Speicherung nutzen. Die Partitionierung ermöglicht es, dass jede Partition separat für die Berechtigung zu Langfristpreisen betrachtet werden kann. Wenn Ihre Tabelle nicht partitioniert ist, darf Ihre gesamte Tabelle 90 aufeinanderfolgende Tage lang nicht bearbeitet werden, damit sie für langfristige Preise in Betracht gezogen werden kann.

Weitere Informationen finden Sie unter Geclusterte und partitionierte Tabellen kombinieren.

Clusterspaltentypen und -reihenfolge

In diesem Abschnitt werden die Spaltentypen und die Funktionsweise der Spaltenreihenfolge beim Tabellen-Clustering beschrieben.

Clusterspaltentypen

Clusterspalten müssen Spalten der obersten Ebene sein, die nicht wiederholt werden. Sie müssen einem der folgenden Datentypen entsprechen:

  • STRING
  • INT64
  • NUMERIC
  • BIGNUMERIC
  • DATE
  • DATETIME
  • TIMESTAMP
  • BOOL
  • GEOGRAPHY

Weitere Informationen zu Datentypen finden Sie unter GoogleSQL-Datentypen.

Reihenfolge der Clusterspalten

Die Reihenfolge geclusterter Spalten wirkt sich auf die Abfrageleistung aus. Damit Sie das Clustering nutzen können, muss die Reihenfolge der Abfragefilter mit der Reihenfolge der geclusterten Spalten übereinstimmen. Weiter muss mindestens die erste geclusterte Spalte enthalten sein.

Im folgenden Beispiel wird die Auftragstabelle mithilfe der Spaltensortierreihenfolge Order_Date, Country und Status geclustert. Eine Abfrage, die nach Order_Date und Country filtert, ist für das Clustering optimiert. Eine Abfrage, die nur nach Country und Status filtert, ist dagegen nicht optimiert. Zum Optimieren der Clustering-Ergebnisse müssen Sie nach geclusterten Spalten in reihenfolge filtern, wobei Sie mit der ersten geclusterten Spalte beginnen.

Abfragen von geclusterten Tabellen müssen geclusterte Spalten in der richtigen Reihenfolge enthalten, beginnend ab der ersten.

Blockbereinigung

Mit geclusterten Tabellen können Sie Ihre Abfragekosten reduzieren, weil darin Daten bereinigt werden, damit nicht alle Daten von der Abfrage verarbeitet werden. Dieser Prozess wird als Blockbereinigung bezeichnet. BigQuery sortiert die Daten in einer geclusterten Tabelle nach den Werten in den Clustering-Spalten und organisiert sie in Blöcken.

Wenn Sie eine Abfrage für eine geclusterte Tabelle ausführen und die Abfrage einen Filter für die geclusterten Spalten enthält, verwendet BigQuery den Filterausdruck und die Blockmetadaten, um die von der Abfrage gescannten Blöcke zu bereinigen. So kann BigQuery ausschließlich relevante Blöcke scannen.

Bereinigte Blöcke werden nicht gescannt. Nur die gescannten Blöcke werden zur Berechnung der von der Abfrage verarbeiteten Byte verwendet. Die Anzahl der Byte, die von einer Abfrage für eine geclusterte Tabelle verarbeitet werden, entspricht der Summe der gelesenen Byte in den einzelnen Spalten, auf die sich die Abfrage bezieht – und zwar in allen gescannten Blöcken.

Wenn sich eine Abfrage mit mehreren Filtern mehrmals auf dieselbe geclusterte Tabelle bezieht, berechnet BigQuery die gescannten Spalten in den entsprechenden Blöcken für jeden einzelnen Filter. Ein Beispiel für die Funktionsweise der Blockbereinigung finden Sie unter Beispiel.

Geclusterte und partitionierte Tabellen kombinieren

Sie können Tabellen-Clustering mit Tabellenpartitionierung kombinieren, um eine detaillierte Sortierung für die weitere Abfrageoptimierung zu ermöglichen.

In einer partitionierten Tabelle werden Daten in physischen Blöcken gespeichert, die jeweils eine Datenpartition enthalten. Die einzelnen partitionierten Tabellen verwalten verschiedene Metadaten zu den Sortiereigenschaften über alle Vorgänge hinweg, die sie ändern. Dank der Metadaten kann BigQuery die Abfragekosten genauer schätzen, bevor eine Abfrage ausgeführt wird. Die Partitionierung erfordert jedoch, dass BigQuery mehr Metadaten verwaltet als bei einer nicht partitionierten Tabelle. Mit zunehmender Anzahl der Partitionen erhöht sich die Menge der zu erhaltenden Metadaten.

Wenn Sie eine geclusterte und partitionierte Tabelle erstellen, so ermöglicht das eine genauere Sortierung, wie im folgenden Diagramm dargestellt:

Tabellen, die nicht geclustert oder partitioniert sind, mit Tabellen vergleichen, die geclustert und partitioniert sind.

Beispiel

Sie haben eine geclusterte Tabelle mit dem Namen ClusteredSalesData. Diese Tabelle ist nach der Spalte timestamp partitioniert und nach der Spalte customer_id geclustert. Die Daten sind in folgende Blöcke unterteilt:

Partitionsbezeichner Block-ID Niedrigster Wert für customer_id im Block Höchster Wert für customer_id im Block
20160501 B1 10000 19999
20160501 B2 20000 24999
20160502 B3 15000 17999
20160501 B4 22000 27999

Sie führen die folgende Abfrage für die Tabelle aus. Die Abfrage enthält einen Filter für die Spalte customer_id.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id BETWEEN 20000
  AND 23000
  AND DATE(timestamp) = "2016-05-01"

Die vorherige Abfrage umfasst die folgenden Schritte:

  • Sie scannt die Spalten timestamp, customer_id und totalSale in den Blöcken B2 und B4.
  • Sie bereinigt den Block B3 aufgrund des Filterprädikats DATE(timestamp) = "2016-05-01" in der partitionierten Spalte timestamp.
  • Sie bereinigt den Block B1 aufgrund des Filterprädikats customer_id BETWEEN 20000 AND 23000 in der Clustering-Spalte customer_id.

Automatisches Re-Clustering

Wenn Daten einer geclusterten Tabelle hinzugefügt werden, werden diese neuen Daten in Blöcken organisiert. Dadurch können neue Speicherblöcke erstellt oder vorhandene Blöcke aktualisiert werden. Die Blockoptimierung ist für eine optimale Abfrage- und Speicherleistung erforderlich, da neue Daten möglicherweise nicht mit vorhandenen Daten mit denselben Clusterwerten gruppiert sind.

BigQuery führt im Hintergrund ein automatisches Re-Clustering durch, um die Leistungsmerkmale geclusterter Tabellen beizubehalten. Bei partitionierten Tabellen wird das Clustering für Daten im Bereich jeder Partition beibehalten.

Beschränkungen

  • Nur GoogleSQL wird zum Abfragen von geclusterten Tabellen und zum Schreiben von Abfrageergebnissen in geclusterte Tabellen unterstützt.
  • Sie können nur bis zu vier Clustering-Spalten angeben. Wenn Sie zusätzliche Spalten benötigen, können Sie das Clustering mit der Partitionierung kombinieren.
  • Wenn für das Clustering Spalten vom Typ STRING genutzt werden, verwendet BigQuery nur die ersten 1.024 Zeichen, um die Daten zu clustern. Die Werte in den Spalten können jedoch aus mehr als 1.024 Zeichen bestehen.
  • Wenn Sie eine vorhandene nicht geclusterte Tabelle so ändern, dass sie geclustert wird, werden die vorhandenen Daten automatisch nicht geclustert. Mit den geclusterten Spalten werden nur neue Daten gespeichert und unterliegen einem automatischen Re-Clustering. Weitere Informationen zum Re-Clusteren vorhandener Daten mithilfe einer direkten UPDATE-Anweisung finden Sie unter Clustering-Spezifikation ändern.

Kontingente und Beschränkungen geclusterter Tabellen

In BigQuery ist die Nutzung freigegebener Google Cloud-Ressourcen durch Kontingente und Limits eingeschränkt, einschließlich Einschränkungen für bestimmte Tabellenvorgänge oder die Anzahl der innerhalb eines Tages auszuführenden Jobs.

Wenn Sie die Funktion für geclusterte Tabellen mit einer partitionierten Tabelle verwenden, unterliegen Sie den Beschränkungen für partitionierte Tabellen.

Kontingente und Beschränkungen gelten auch für die verschiedenen Arten von Jobs, die für geclusterte Tabellen ausgeführt werden können. Informationen zu den Jobkontingenten, die für Ihre Tabellen gelten, finden Sie unter Jobs unter „Kontingente und Limits“.

Preise für geclusterte Tabellen

Wenn Sie in BigQuery geclusterte Tabellen erstellen und verwenden, hängen die Kosten davon ab, welches Datenvolumen in den Tabellen gespeichert wird und welche Abfragen für die Daten ausgeführt werden. Weitere Informationen finden Sie unter Speicherpreise und Abfragepreise.

Wie andere BigQuery-Tabellenvorgänge nutzen geclusterte Tabellenvorgänge kostenlose BigQuery-Vorgänge, z. B. Batchladevorgänge, Tabellenkopien, automatisches Re-Clustering und Datenexport. Diese Vorgänge unterliegen den BigQuery-Kontingenten und -Limits. Weitere Informationen zu kostenlosen Vorgängen finden Sie unter Kostenlose Vorgänge.

Ein detailliertes Beispiel für die Preise geclusterter Tabellen finden Sie unter Speicher- und Abfragekosten schätzen.

Tabellensicherheit

Informationen zum Steuern des Zugriffs auf Tabellen in BigQuery finden Sie unter Einführung in die Tabellenzugriffssteuerung.

Nächste Schritte