Apache Iceberg™-Tabellen verwalten

Apache Iceberg™-Tabellen in Snowflake verwalten:

Sie können auch eine Iceberg-Tabelle, die einen externen Katalog verwendet, in eine Tabelle konvertieren, die Snowflake als Iceberg-Katalog verwendet. Weitere Informationen dazu finden Sie unter Apache Iceberg™-Tabelle konvertieren, um Snowflake als Katalog zu verwenden.

Eine Tabelle abfragen

Um eine Iceberg-Tabelle abzufragen, muss ein Benutzer die folgenden Berechtigungen erhalten oder erben:

  • Die USAGE-Berechtigung für die Datenbank und das Schema, die die Tabelle enthalten

  • Die SELECT-Berechtigungen für die Tabelle

Sie können eine Iceberg-Tabelle mit einer SELECT-Anweisung abfragen. Beispiel:

SELECT col1, col2 FROM my_iceberg_table;
Copy

Bemerkung

Neben Snowflake können Sie auch eine externe Abfrage-Engine verwenden, um Iceberg-Tabellen abzufragen. Weitere Informationen dazu finden Sie unter Verwenden einer externen Abfrage-Engine mit Apache Iceberg™-Tabellen.

DML -Befehle verwenden

Iceberg-Tabellen, die Snowflake als Katalog verwenden, unterstützen vollständig Befehle der Datenbearbeitungssprache (DML):

Von Snowflake verwaltete Tabellen unterstützen auch effizientes Massenladen mit Features wie COPY INTO <Tabelle> und Snowpipe. Weitere Informationen dazu finden Sie unter Laden von Daten in Apache Iceberg™-Tabellen.

Bemerkung

  • Snowflake unterstützt auch das Schreiben in extern verwaltete Iceberg-Tabellen. Weitere Informationen dazu finden Sie unter Schreibunterstützung für extern verwaltete Apache Iceberg™-Tabellen und Schreiben in extern verwaltete Iceberg-Tabellen.

  • Für von Snowflake verwaltete Iceberg-Tabellen gilt: Wenn ein DML-Vorgang unerwartet fehlschlägt und zurückgesetzt wird, werden möglicherweise einige Parquet-Dateien in Ihren externen Cloudspeicher geschrieben, aber von den Metadaten Ihrer Iceberg-Tabellen nicht verfolgt oder referenziert. Diese Parquet-Dateien sind verwaiste Dateien.

    Wenn Sie eine Diskrepanz zwischen der Speichernutzung Ihres externen Cloudspeichers und Snowflake feststellen, befinden sich möglicherweise verwaiste Dateien in Ihrem externen Cloudspeicher. Um Ihre Speichernutzung für Snowflake anzuzeigen, können Sie die Ansicht TABLE_STORAGE_METRICS oder Ansicht TABLE_STORAGE_METRICS verwenden. Wenn Sie einen Konflikt feststellen, wenden Sie sich an den Snowflake-Support, um herauszufinden, ob Sie verwaiste Dateien haben, und diese zu entfernen.

Beispiel: Eine Tabelle aktualisieren

Sie können INSERT- und UPDATE- Anweisungen verwenden, um von Snowflake verwaltete Iceberg-Tabellen zu ändern.

Im folgenden Beispiel wird in eine Iceberg-Tabelle namens store_sales ein neuer Wert eingefügt, und dann wird die Spalte cola auf 1 aktualisiert, wenn der Wert derzeit -99 ist.

INSERT INTO store_sales VALUES (-99);

UPDATE store_sales
  SET cola = 1
  WHERE cola = -99;
Copy

Snapshots von DML-Änderungen generieren

Bei Tabellen, die Snowflake als Katalog verwenden, generiert Snowflake automatisch die Iceberg-Metadaten. Snowflake schreibt die Metadaten in einen Ordner namens metadata auf Ihrem externen Volume. Um den Ordner metadata zu finden, siehe Daten- und Metadatenverzeichnisse.

Alternativ können Sie die Funktion SYSTEM$GET_ICEBERG_TABLE_INFORMATION aufrufen, um Iceberg-Metadaten für alle neuen Änderungen zu generieren.

Bei Tabellen, die nicht von Snowflake verwaltet werden, gibt die Funktion Informationen zum letzten aktualisierten Snapshot zurück.

Beispiel:

SELECT SYSTEM$GET_ICEBERG_TABLE_INFORMATION('db1.schema1.it1');
Copy

Ausgabe:

+-----------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_ICEBERG_TABLE_INFORMATION('DB1.SCHEMA1.IT1')                                                   |
|-----------------------------------------------------------------------------------------------------------|
| {"metadataLocation":"s3://mybucket/metadata/v1.metadata.json","status":"success"}                         |
+-----------------------------------------------------------------------------------------------------------+

Löschungen auf Zeilenebene verwenden

Snowflake unterstützt das Abfragen von Tabellen mit Löschvorgängen auf Zeilenebene und das Schreiben in Tabellen unter Verwendung von Löschvorgängen auf Zeilenebene.

Abfragen von Tabellen

Snowflake unterstützt die Abfrage von extern verwalteten Iceberg-Tabellen, wenn Sie Löschungen auf Zeilenebene für Aktualisierungs-, Lösch- und Zusammenführungsoperationen konfiguriert haben.

Wie Sie Löschungen auf Zeilenebene konfigurieren können, finden Sie unter Schreibeigenschaften in der Apache Iceberg Dokumentation.

Schreiben in Tabellen mithilfe von positionsbezogenen Löschdateien

Bemerkung

  • Wird nur für extern verwaltete Iceberg-Tabellen unterstützt.

  • Um Löschungen auf Zeilenebene zu verwenden, stellen Sie sicher, dass die Iceberg-Version für Iceberg-Tabellen auf v2 eingestellt ist, was die Standardeinstellung ist. Weitere Informationen dazu finden Sie unter ICEBERG_VERSION_DEFAULT. Wenn die Iceberg-Version auf v3 eingestellt ist, werden als Merge-on-Read-Verhalten in Snowflake Löschvektoren verwendet.

Snowflake unterstützt Löschvorgänge auf Zeilenebene, um in extern verwaltete Iceberg-Tabellen zu schreiben, die auf Amazon S3, Azure oder Google Cloud gespeichert sind. Um Positionslöschungen zu deaktivieren, was die Ausführung von DML-Operationen im Copy-on-Write-Modus ermöglicht, setzen Sie den ENABLE_ICEBERG_MERGE_ON_READ-Parameter auf Tabellen-, Schema- oder Datenbankebene auf FALSE.

Schreiben in Tabellen mithilfe von Löschvektoren

Um Datenänderungen auf Zeilenebene zu optimieren, unterstützt Snowflake Löschvektoren für das Schreiben in extern verwaltete und Snowflake-verwaltete Iceberg-Tabellen, die in Amazon S3, Azure oder Google Cloud gespeichert sind. Mit Löschvektoren kann Snowflake „Merge-on-Read“ (MOR)-Operationen ausführen, die die Schreibleistung für die folgenden DML-Anweisungen verbessern:

  • DELETE

  • UPDATE

  • MERGE

Snowflake erreicht diese Leistung, indem kleine Vektordateien geschrieben werden, anstatt große Datendateien umzuschreiben. Weitere Informationen dazu finden Sie unter Löschvektoren in der Apache Iceberg-Spezifikation.

Aktivieren von Löschvektoren

Um Löschvektoren zu aktivieren, führen Sie die folgenden Schritte aus:

  1. Setzen Sie die standardmäßige Iceberg-Version für Iceberg-Tabellen auf v3, indem Sie die Anweisungen unter Konfigurieren der Iceberg-Standardversion befolgen.

    Bemerkung

    Wenn die standardmäßige Iceberg-Version für Iceberg-Tabellen v2 ist, führt Snowflake „Merge-on-Read“ (MOR)-Operationen mithilfe von positionsbezogenen Löschdateien aus.

  2. Stellen Sie den Parameter ENABLE_ICEBERG_MERGE_ON_READ auf TRUE ein, was die Standardeinstellung ist, indem Sie die Anweisungen unter ENABLE_ICEBERG_MERGE_ON_READ befolgen.

  3. Zum Ausführen von DML-Operationen im „Copy-on-Write“-Modus setzen Sie den Parameter ENABLE_ICEBERG_MERGE_ON_READ auf FALSE.

Nutzungshinweise für Löschvektoren

  • Standardverhalten

    • Der Systemstandard für ENABLE_ICEBERG_MERGE_ON_READ ist TRUE.

  • Heuristik der Schreibmethode

    • Wenn ENABLE_ICEBERG_MERGE_ON_READ auf TRUE eingestellt ist, verwendet Snowflake die Heuristik, um pro Datei zu entscheiden, ob Merge-on-Read oder Copy-on-Write verwendet werden soll:

      • Anzahl der Zeilen: Snowflake schreibt nur dann einen Löschvektor, wenn weniger als ~5 % der Zeilen in einer Datendatei gelöscht werden. Wenn ≥5 % gelöscht werden, schreibt Snowflake die Datei neu, indem Copy-on-Write verwendet wird.

      • Dateigröße: Damit Snowflake Löschvektoren schreiben kann, muss die Datendatei größer als etwa 1,6 MB sein.

  • Kompatibilität

    • Wenn Sie Computemodule verwenden, die noch keine Iceberg v3-Löschvektoren unterstützen, setzen Sie ENABLE_ICEBERG_MERGE_ON_READ auf FALSE, um Copy-on-Write für alle Schreiboperationen zu erzwingen.

  • Rangfolge der Parameter

    • Snowflake überprüft nur den Parameter ENABLE_ICEBERG_MERGE_ON_READ, um die Schreibmethode zu bestimmen. Die folgenden Eigenschaften der Iceberg-Tabelle werden nicht erkannt:

      • write.delete.mode

      • write.update.mode

      • write.merge.mode

Copy-on-Write vs. Merge-on-Read

Iceberg bietet zwei Modi, um zu konfigurieren, wie Compute Engines Operationen auf Zeilenebene für extern verwaltete Tabellen behandeln. Snowflake unterstützt diese beiden Modi.

Die folgende Tabelle beschreibt, wann Sie die einzelnen Modi verwenden sollten:

Modus

Beschreibung

Copy-on-Write (Standard)

Dieser Modus priorisiert die Lesezeit und beeinträchtigt die Schreibgeschwindigkeit.

Wenn Sie einen Aktualisierungs-, Lösch- oder Zusammenführungsvorgang durchführen, schreibt Ihre Compute Engine die gesamte betroffene Parquet-Datendatei neu. Dies kann zu langsamen Schreibvorgängen führen, insbesondere wenn Sie große Datendateien haben, hat aber keine Auswirkungen auf die Lesezeit.

Dies ist der Standardmodus.

Merge-on-Read

In diesem Modus hat die Schreibgeschwindigkeit Vorrang und die Lesezeit wird leicht beeinträchtigt.

Wenn Sie einen Aktualisierungs-, Lösch- oder Zusammenführungsvorgang durchführen, erstellt Ihre Compute Engine eine Löschdatei, die nur Informationen über die geänderten Zeilen enthält.

Wenn Sie aus einer Tabelle lesen, führt Ihr Abfrageprogramm die Löschdateien mit den Datendateien zusammen. Das Zusammenführen kann die Lesezeit erhöhen. Sie können jedoch die Leseleistung optimieren, indem Sie eine regelmäßige Verdichtung und Tabellenpflege einplanen.

Weitere Informationen über Änderungen auf Zeilenebene für Iceberg finden Sie unter Löschungen auf Zeilenebene in der Apache Iceberg-Dokumentation.

Hinweise und Einschränkungen

Beachten Sie die folgenden Informationen, wenn Sie Löschvorgänge auf Zeilenebene mit Iceberg-Tabellen verwenden:

  • Snowflake unterstützt positionsbezogene Löschungen nur für v2 Iceberg-Tabellen und Löschvektoren für v3 Iceberg-Tabellen.

  • Snowflake unterstützt nur das Löschen von positionsbezogenen Löschungen mit extern verwalteten Iceberg-Tabellen.

  • Um die beste Leseleistung zu erzielen, wenn Sie Löschungen auf Zeilenebene verwenden, führen Sie regelmäßig eine Verdichtung und Tabellenpflege durch, um alte Löschdateien zu entfernen. Weitere Informationen dazu finden Sie unter Tabellen warten, die einen externen Katalog verwenden.

  • Übermäßige Positionslöschungen, insbesondere verwaiste Positionslöschungen, können das Erstellen von Tabellen und Aktualisierungsoperationen verhindern. Um dieses Problem zu vermeiden, führen Sie eine Tabellenwartung durch, um zusätzliche Positionslöschungen zu entfernen.

    Die zu verwendende Methode zur Wartung der Tabellen hängt von Ihrer externen Iceberg-Engine ab. Sie können zum Beispiel die rewrite_data_files-Methode für Spark mit der Option delete-file-threshold oder rewrite-all verwenden. Weitere Informationen dazu finden Sie unter rewrite_data_files in der Apache Iceberg™-Dokumentation.

Zieldateigröße festlegen

Um die Abfrageleistung für externe Iceberg-Engines wie Spark oder Trino zu verbessern, können Sie eine Zieldateigröße sowohl für von Snowflake verwaltete als auch für extern verwaltete Iceberg-Tabellen mit Schreibunterstützung konfigurieren. Sie können entweder eine bestimmte Größe festlegen (16MB, 32MB, 64MB oder 128MB), oder Sie verwenden die AUTO-Option. AUTO funktioniert je nach Tabellentyp unterschiedlich:

  • Von Snowflake verwaltete Tabellen: AUTO gibt an, dass Snowflake die Dateigröße für die Tabelle auf Grundlage von Tabellenmerkmalen wie Größe, DML-Muster, Datenaufnahme-Workload und Clustering-Konfiguration auswählen soll. Snowflake passt die Dateigröße automatisch an, beginnend mit 16 MB, um die Leistung beim Lesen und Schreiben in Snowflake zu verbessern.

  • Extern verwaltete Tabellen: AUTO gibt an, dass Snowflake aggressiv auf eine größere Dateigröße skalieren soll.

Sie können die Zieldateigröße festlegen, wenn Sie eine Iceberg-Tabelle erstellen, oder den Befehl ALTER ICEBERG TABLE ausführen, um die Zieldateigröße für eine bestehende Iceberg-Tabelle zu ändern. Snowflake versucht, beim Schreiben von Parquet-Dateien für eine Tabelle die Dateigrößen nahe an der Zielgröße zu halten.

Nachdem Sie eine Zieldateigröße festgelegt haben, beginnt Snowflake sofort, größere Dateien für die neuen DML-Operationen (Data Manipulation Language) zu erstellen. Die Tabellenwartungsoperationen von Snowflake ändern die vorhandenen Tabellendateien asynchron entsprechend der Größe der Zieldatei.

Das folgende Beispiel verwendet TARGET_FILE_SIZE, um eine Zieldateigröße von 128 MB für eine von Snowflake verwaltete Tabelle festzulegen:

CREATE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  TARGET_FILE_SIZE = '128MB';
Copy

Alternativ können Sie auch ALTER ICEBERG TABLE verwenden, um die TARGET_FILE_SIZE-Eigenschaft für eine bestehende Tabelle festzulegen:

ALTER ICEBERG TABLE my_iceberg_table
  SET TARGET_FILE_SIZE = '32MB';
Copy

Verwenden Sie zum Überprüfen des Werts der Eigenschaft TARGET_FILE_SIZE für eine Tabelle den Befehl SHOW PARAMETERS:

SHOW PARAMETERS LIKE 'target_file_size' FOR my_iceberg_table;
Copy

Tabellenoptimierung für von Snowflake verwaltete Iceberg-Tabellen

Die Tabellenoptimierung führt automatisch Wartungsarbeiten durch, um die Leistung zu verbessern und die Speicherkosten Ihrer von Snowflake verwalteten Iceberg-Tabellen zu senken.

Bemerkung

  • Snowflake unterstützt nicht das Löschen verwaister Dateien für von Snowflake verwaltete Iceberg-Tabellen. Wenn Sie eine Diskrepanz zwischen der Speichernutzung Ihres externen Cloudspeichers und Snowflake feststellen, befinden sich möglicherweise verwaiste Dateien in Ihrem externen Cloudspeicher. Um Ihre Speichernutzung für Snowflake anzuzeigen, können Sie die Ansicht TABLE_STORAGE_METRICS oder Ansicht TABLE_STORAGE_METRICS verwenden. Wenn Sie einen Konflikt feststellen, wenden Sie sich an den Snowflake-Support, um herauszufinden, ob Sie verwaiste Dateien haben, und diese zu entfernen.

  • Um die Abfrageleistung zu verbessern, können Sie auch eine Zieldateigröße festlegen. Weitere Informationen dazu finden Sie unter Zieldateigröße festlegen.

Snowflake unterstützt die Features zur Optimierung von Iceberg-Tabellen, die in der folgenden Tabelle zusammengefasst sind:

Feature

Verbessert die Abfrageleistung

Reduziert die Speicherkosten

Anmerkungen

Automatic Clustering [1]

  • Abgerechnet.

  • Standardmäßig deaktiviert.

Datenkomprimierung

  • Abgerechnet.

  • Standardmäßig aktiviert.

Manifestkomprimierung

  • Keine Kosten.

  • Automatisch aktiviert; kann nicht aktiviert werden.

Ablauf von Snapshots

  • Keine Kosten.

  • Automatisch aktiviert; kann nicht aktiviert werden.

[1] Im Gegensatz zu den anderen Features zur Tabellenoptimierung wird Automatic Clustering als eigenständiges Feature separat in Rechnung gestellt.

Automatic Clustering

Automatic Clustering reorganisiert Daten in Dateien oder Partitionen auf der Grundlage häufig abgefragter Spalten. Die Dateigröße für Iceberg-Tabellen basiert auf Ihrer Clustering-Konfiguration, es sei denn, Sie legen eine Zieldateigröße fest. Wenn Sie dies tun, entspricht die Dateigröße der von Ihnen festgelegten Größe. Weitere Informationen dazu finden Sie unter Zieldateigröße festlegen.

Um Automatic Clustering einzustellen, geben Sie den Parameter CLUSTER BY an, wenn Sie eine von Snowflake verwaltete Iceberg-Tabelle erstellen oder eine bestehende Tabelle ändern. Weitere Informationen dazu finden Sie unter:

Weitere Informationen zu Automatic Clustering finden Sie unter Automatic Clustering.

Datenkomprimierung

Bei der Datenkomprimierung werden kleine Dateien zu größeren, effizienteren Dateien kombiniert, um den Speicherplatz zu verwalten, eine optimale Dateigröße beizubehalten und die Abfrageleistung zu verbessern.

In den meisten Fällen hat die Datenkomprimierung keinen nennenswerten Einfluss auf die Computekosten, aber wenn diese Kosten ein Problem darstellen, können Sie die Komprimierung deaktivieren. Sie können zum Beispiel die Komprimierung für eine Tabelle deaktivieren, wenn Sie sie nur selten abfragen. Informationen zum Deaktivieren bzw. Aktivieren der Datenkomprimierung finden Sie unter Datenkomprimierung festlegen.

Bemerkung

  • Weitere Informationen zum Abfragen von Datenkomprimierungsjobs für Iceberg-Tabellen finden Sie unter Ansicht ICEBERG_STORAGE_OPTIMIZATION_HISTORY. Diese Ansicht enthält die Anzahl der Credits, die für die Datenkomprimierung in Rechnung gestellt wurden.

  • Wenn Sie Automatic Clustering aktiviert haben, führt das Clustering eine Datenkomprimierung für die Tabelle durch. Dies gilt unabhängig davon, ob die Datenkomprimierung für die Tabelle aktiviert oder deaktiviert ist.

  • Sie haben auch die Möglichkeit, eine Zieldateigröße festzulegen. Weitere Informationen dazu finden Sie unter Zieldateigröße festlegen.

Manifestkomprimierung

Die Manifestkomprimierung optimiert die Metadatenschicht, indem kleinere Manifestdateien neu organisiert und kombiniert werden. Diese Komprimierung reduziert den Metadaten-Overhead und verbessert die Abfrageleistung.

Dieses Feature ist automatisch aktiviert und Sie können es nicht deaktivieren.

Ablauf von Snapshots

Durch den Ablauf von Snapshots werden systematisch alte Snapshots und deren eindeutige Daten- und Metadatendateien aus dem Tabellenverlauf gelöscht. Dieses Löschen basiert auf vordefinierten Aufbewahrungsrichtlinien.

Dieses Feature ist automatisch aktiviert und Sie können es nicht deaktivieren.

Tabellen warten, die einen externen Katalog verwenden

Sie können Wartungsoperationen auf Iceberg-Tabellen ausführen, die einen externen Katalog verwenden.

Die Wartungsoperationen umfassen Folgendes:

  • Snapshots ablaufen lassen

  • Alte Metadaten-Dateien entfernen

  • Datendateien komprimieren

Wichtig

Um Ihre Iceberg-Tabelle mit externen Änderungen synchron zu halten, ist es wichtig, dass Sie Ihren Snowflake-Aktualisierungsplan mit der Tabellenwartung abstimmen. Aktualisieren Sie die Tabelle jedes Mal, wenn Sie eine Wartungsoperation ausführen.

Informationen zur Wartung von Iceberg-Tabellen, die nicht von Snowflake verwaltet werden, finden Sie in der Apache Iceberg-Dokumentation unter Wartung.

Tabellen-Metadaten aktualisieren

Wenn Sie einen externen Iceberg-Katalog verwenden, können Sie die Metadaten der Tabelle mit dem Befehl ALTER ICEBERG TABLE … REFRESH aktualisieren. Durch das Aktualisieren der Tabellenmetadaten werden die Metadaten mit den jüngsten Tabellenänderungen synchronisiert.

Bemerkung

Wir empfehlen die Einrichtung der automatischen Aktualisierung für unterstützte, extern verwaltete Tabellen.

Aktualisieren der Metadaten für eine Tabelle

Das folgende Beispiel aktualisiert manuell die Metadaten für eine Tabelle, die einen externen Katalog verwendet (z. B. AWS Glue oder Delta). Durch das Aktualisieren der Tabelle wird die Tabelle mit allen Änderungen, die im Remote-Katalog vorgenommen wurden, synchronisiert.

Bei diesem Typ von Iceberg-Tabelle geben Sie im Befehl keinen Pfad zur Metadatendatei an.

ALTER ICEBERG TABLE my_iceberg_table REFRESH;
Copy

Um eine Tabelle automatisch zu aktualisieren, können Sie automatische Aktualisierung einrichten. Verwenden Sie den Befehl ALTER ICEBERG TABLE.

Beispiel:

ALTER ICEBERG TABLE my_iceberg_table SET AUTO_REFRESH = TRUE;
Copy

Aktualisieren Sie die Metadaten für eine aus Iceberg-Dateien erstellte Tabelle

Im folgenden Beispiel wird eine Tabelle manuell aktualisiert, die aus Iceberg-Metadatendateien in einem externen Cloudspeicherort erstellt wurde, wobei der relative Pfad zu einer Metadatendatei ohne Schrägstrich (/) angegeben wird. Die Metadatendatei definiert die Daten in der Tabelle nach dem Aktualisieren.

ALTER ICEBERG TABLE my_iceberg_table REFRESH 'metadata/v1.metadata.json';
Copy

Speichermetriken abrufen

Snowflake stellt Ihrem Konto keine Kosten für die Speicherung der Iceberg-Tabellen in Rechnung. Sie können jedoch nachvollziehen, wie viel Speicherplatz eine Iceberg-Tabelle belegt, indem Sie die Ansichten TABLE_STORAGE_METRICS und TABLES im Schema Snowflake Information Schema oder Account Usage abfragen.

Die folgende Beispielabfrage verbindet die Ansicht ACCOUNT_USAGE.TABLE_STORAGE_METRICS mit der Ansicht ACCOUNT_USAGE.TABLES und filtert nach der Spalte TABLES.IS_ICEBERG.

SELECT metrics.* FROM
  snowflake.account_usage.table_storage_metrics metrics
  INNER JOIN snowflake.account_usage.tables tables
  ON (
    metrics.id = tables.table_id
    AND metrics.table_schema_id = tables.table_schema_id
    AND metrics.table_catalog_id = tables.table_catalog_id
  )
  WHERE tables.is_iceberg='YES';
Copy

Datenkomprimierung festlegen

Sie können die Datenkomprimierung für von Snowflake verwaltete Iceberg-Tabellen festlegen, wenn Sie eine Datenbank, ein Schema oder eine Tabelle erstellen, oder den Befehl ALTER ausführen, um die Einstellung für eine Datenbank, ein Schema oder eine Tabelle zu ändern. Sie können die Datenkomprimierung auch auf Kontoebene festlegen, indem Sie den Befehl ALTER ACCOUNT verwenden. Weitere Informationen zur Datenkomprimierung finden Sie unter Datenkomprimierung.

Im folgenden Beispiel wird ENABLE_DATA_COMPACTION zum Deaktivieren der Datenkomprimierung für eine von Snowflake verwaltete Tabelle verwendet:

CREATE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  ENABLE_DATA_COMPACTION = FALSE;
Copy

Alternativ können Sie auch ALTER ICEBERG TABLE verwenden, um sie für eine bestehende Tabelle zu deaktivieren.

ALTER ICEBERG TABLE my_iceberg_table
  SET ENABLE_DATA_COMPACTION = FALSE;
Copy

Weitere Informationen dazu finden Sie unter:

Verwenden von Iceberg-Tabellen mit Standardwerten

Bemerkung

Weitere Features von Iceberg v3, die in dieser Vorschau unterstützt werden, finden Sie unter Apache Iceberg™-Tabellen: Unterstützung für Apache Iceberg™ v3 (Vorschau).

Mit dieser Vorschau wird die Unterstützung des Features Standardwerte für Apache Iceberg™-Tabellen gemäß der Iceberg v3-Spezifikation eingeführt.

Wichtig

Um Standardwerte mit Iceberg-Tabellen verwenden zu können, müssen die Tabellen v3 der Apache Iceberg™-Tabellenspezifikation entsprechen. Eine Anleitung zum Konfigurieren der Iceberg-Version für Tabellen finden Sie unter Konfigurieren der Iceberg-Standardversion.

Mit diesem Feature können Sie Standardwerte für vorhandene und neue Datensätze festlegen, ohne vorhandene Datendateien neu schreiben zu müssen. Sie können die folgenden Standardwerte für Tabellenspalten festlegen:

  • Einen anfänglichen Standardwert, der einen Standardwert für vorhandene Datensätze bereitstellt, wenn ein Feld hinzugefügt wird.

  • Ein Schreibstandard, der einen Standardwert für neue Datensätze bereitstellt, wenn das Feld mit dem Standardwert beim Schreiben nicht angegeben wird.

Mit diesem Feature können Sie Schemas weiterentwickeln, während Sie Werte für historische Daten präsentieren und einen Fallback-Wert für zukünftige Schreibvorgänge bereitstellen. Weitere Informationen dazu finden Sie unter Standardwerte.

Sie können einen Standardwert angeben, wenn Sie eine Tabelle erstellen oder ändern:

  • Um eine Tabelle mit einem Standardwert für eine Spalte zu erstellen, verwenden Sie das Schlüsselwort DEFAULT mit Ihrer Spaltendefinition. Der von Ihnen angegebene Wert wird sowohl als anfänglicher Standardwert als auch als Schreibstandard für die Spalte festgelegt. Sie können den anfänglichen Standardwert für die Spalte nicht ändern.

  • Um einer Tabelle eine Spalte mit einem Standardwert hinzuzufügen, verwenden Sie das Schlüsselwort DEFAULT mit der Spaltendefinition in Ihrem ALTER ICEBERG TABLE-Befehl. Der von Ihnen angegebene Wert wird sowohl als anfänglicher Standardwert als auch als Schreibstandard für die Spalte festgelegt. Sie können den anfänglichen Standardwert für die Spalte nicht ändern.

  • Um den Schreibstandard für eine Spalte zu ändern, verwenden Sie die Schlüsselwörter WRITE DEFAULT mit dem ALTER ICEBERG TABLE-Befehl.

Wichtig

Wenn Sie einen Standardwert für eine Spalte angeben, müssen Sie einen statischen Wert angeben. Sie können keinen Ausdruck bzw. keine Funktion für den Wert angeben. Diese Anforderung entspricht der Iceberg v3-Spezifikation und gilt sowohl für den anfänglichen Standardwert als auch für den Schreibstandard.

Die folgenden Abschnitte enthalten Beispiele für die Angabe von Standardwerten und die Änderung des Standardschreibwertes.

Beispiel: Erstellen einer Tabelle mit einem Standardwert

Um eine Iceberg-Tabelle mit Standardwerten zu erstellen, verwenden Sie den Befehl CREATE ICEBERG TABLE.

Im folgenden Beispiel legen Sie zunächst einen Standardwert für eine Spalte fest, wenn Sie eine von Snowflake verwaltete Iceberg-Tabelle erstellen. Als Nächstes fügen Sie einen Datensatz in die Tabelle ein, ohne einen Wert für die Spalte mit dem Standardwert anzugeben.

  1. Erstellen Sie eine user_events-Tabelle, die eine event_version-Spalte mit dem Standardwert 2 enthält:

    CREATE ICEBERG TABLE user_events (
        event_id INT,
        user_id INT,
        event_type STRING,
        event_time TIMESTAMP,
        event_version INT DEFAULT 2
      )
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'my_external_volume'
      BASE_LOCATION = 'database/schema/user_event'
      ICEBERG_VERSION = 3;
    
    Copy

    Durch Festlegen eines Standardwerts in der Tabellendefinition wird ein anfänglicher Standardwert und ein Schreibstandard festgelegt. Da die Spalte einen Schreibstandard hat, wird der Wert 2 für neue Datensätze verwendet, wenn die event_version beim Schreiben nicht angegeben wird.

  2. Fügen Sie ein Anmeldeereignis mit angegebener event_version hinzu:

    INSERT INTO user_events VALUES
      (1, 101, 'login', '2025-11-01 10:00:00', 1);
    
    Copy
  3. Fügen Sie ein Kaufereignis hinzu, geben Sie aber keine event_version an:

    INSERT INTO user_events VALUES
    (1, 101, 'purchase', '2025-11-01 10:01:00');
    
    Copy

    Als Ergebnis gibt Snowflake den Wert für die event_version in die Tabelle als 2 ein.

  4. Abfragen der Tabelle:

    SELECT * FROM user_events;
    
    Copy

    Ausgabe:

    +-----------+----------+-------------+---------------------+----------------+
    | event_id  | user_id  | event_type  | event_time          | event_version  |
    +-----------+----------+-------------+---------------------+----------------+
    | 1         | 101      | login       | 2025-11-01 10:00:00 | 1              |
    | 1         | 101      | purchase    | 2025-11-01 10:01:00 | 2              |
    +-----------+----------+-------------+---------------------+----------------+
    

Beispiel: Hinzufügen einer Spalte mit einem Standardwert zu einer bestehenden Tabelle

Um eine neue Spalte mit einem Standardwert zu einer Iceberg-Tabelle hinzuzufügen, verwenden Sie den Befehl ALTER ICEBERG TABLE.

Im folgenden Beispiel ändern Sie die user_events-Tabelle durch Hinzufügen einer event_version-Spalte, die den Standardwert 2 hat:

ALTER ICEBERG TABLE user_events ADD COLUMN event_version INT DEFAULT 2;
Copy

Zusätzlich zum Festlegen eines Schreibstandards wird durch das Hinzufügen einer Spalte mit einem Standardwert auch ein anfänglicher Standardwert für die Spalte festgelegt. Infolgedessen lautet der Standardwert für vorhandene Datensätze für die event_version-Spalte 2.

Beispiel: Ändern des Schreibstandards für eine Spalte

Im folgenden Beispiel wird der Schreibstandard für die event_version-Spalte der user_events-Tabelle in 3 geändert:

ALTER ICEBERG TABLE user_events ALTER COLUMN event_version SET WRITE DEFAULT 3;
Copy

Anzeigen der für eine Tabelle definierten Standardwerte

Um den Standardwert für eine Tabellenspalte in einer von Snowflake verwalteten oder extern verwalteten Iceberg-Tabelle anzuzeigen, führen Sie den Befehl DESCRIBE ICEBERG TABLE aus, und zeigen Sie dann die DEFAULT-Spalte und die WRITE DEFAULT-Spalte in der Ausgabe an:

  • Die Spalte DEFAULT wird dem initial-default-Wert in der Apache Iceberg-Spezifikation zugeordnet.

  • Die Spalte WRITE DEFAULT wird dem write-default-Wert in der Apache Iceberg-Spezifikation zugeordnet.

Diese Spalten werden in der Ausgabe zurückgegeben, unabhängig davon, ob es sich bei der Tabelle um eine v2 Iceberg-Tabelle oder eine v3 Iceberg-Tabelle handelt.

Im folgenden Beispiel werden die Spalten für die user_events-Tabelle beschrieben. Diese Tabelle hat einen anfänglichen Standardwert und einen Schreibstandard, der für die event_version-Spalte festgelegt ist:

DESC ICEBERG TABLE user_events
  ->> SELECT
    "name",
    "kind",
    "default",
    "write default"
      FROM $1;
Copy

Ausgabe:

+-----------------+---------+---------+---------------+
| name            | kind    | default | write default |
+-----------------+---------+-------------------------+
| EVENT_ID        | COLUMN  |         |               |
| USER_ID         | COLUMN  |         |               |
| EVENT_TYPE      | COLUMN  |         |               |
| EVENT_TIME      | COLUMN  |         |               |
| EVENT_VERSION   | COLUMN  | 2       | 3             |
+-----------------+---------+---------+---------------+

Löschen des Schreibstandards

Um den Schreibstandard für eine Spalte zu löschen, verwenden Sie die Schlüsselwörter DROP WRITE DEFAULT mit dem Befehl ALTER ICEBERG TABLE.

Im folgenden Beispiel wird der Standard-Schreibwert für die event_version-Spalte gelöscht:

ALTER ICEBERG TABLE user_events ALTER COLUMN event_version DROP WRITE DEFAULT;
Copy

Hinweise und Einschränkungen für Standardwerte

Beachten Sie die folgenden Punkte, wenn Sie Standardwerte mit von Snowflake verwalteten und extern verwalteten Iceberg-Tabellen verwenden:

Von Snowflake verwaltete und extern verwaltete Iceberg-Tabellen

  • Sie können später keinen anfänglichen Standardwert für eine Spalte hinzufügen oder ändern, nachdem Sie sie erstellt haben. Daher müssen Sie die Spalte löschen und die Spalte mit den Befehlen ALTER TABLE … DROP COLUMN und ALTER TABLE … ADD COLUMN hinzufügen.

  • Die maximale Größe für einen Standardwert ist 128|~|MB.

  • Standardwerte können keine Datentypen verwenden, die nicht als Konstanten dargestellt werden können. Daher können Sie die folgenden Datentypen nicht mit einem Standardwert verwenden:

    • map

    • list

    • struct

    • variant

Snowflake-verwaltete Iceberg-Tabellen

  • Der write-default-Wert wird immer mit dem initial-default-Wert initialisiert. Um die Standardeinstellung für diese beiden Werte anzuzeigen, führen Sie den Befehl DESCRIBE ICEBERG TABLE aus, und zeigen Sie dann die Spalten WRITE DEFAULT und DEFAULT in der Ausgabe an.

  • Sie können keinen Standardwert angeben, der den Datentyp TIMESTAMP_NTZ(9) oder TIMESTAMP_LTZ(9) verwendet.

  • Sie können nur einen Standardwert für einen Ausdruck festlegen, z. B. DEFAULT pi(), wenn Sie eine Tabelle erstellen. Sie können keinen Standardwert für einen Ausdruck festlegen, wenn Sie eine Tabelle mit dem Befehl ALTER ICEBERG TABLE ändern.

  • Sequenzen werden nicht unterstützt.

    Zum Beispiel schlägt der folgende Befehl CREATE ICEBERG TABLE fehl, weil er LOG_ID NUMBER(38,0) NOT NULL autoincrement order enthält:

    CREATE OR REPLACE ICEBERG TABLE CDC_RUN_LOG (
        LOG_ID NUMBER(38,0) NOT NULL autoincrement order,
        ENTITY_NAME VARCHAR(100),
        LAST_RUN TIMESTAMP_NTZ(9),
        DAG_NAME VARCHAR(100)
        )
        CATALOG = 'SNOWFLAKE'
        EXTERNAL_VOLUME = 'my_external_volume'
        BASE_LOCATION = 'my_iceberg_table';
        COMMENT='CDC table to manage log of runs'
        ICEBERG_VERSION = 3;
    
    Copy

Extern verwaltete Iceberg-Tabellen

  • Sie können keinen Standardwert angeben, der den Datentyp TIMESTAMP_NTZ(9) oder TIMESTAMP_LTZ(9) verwendet.

Diese Hinweise und Einschränkungen gelten für Standardwerte, die Features von Iceberg v3 sind. Eine Liste der Hinweise und Einschränkungen, die für alle Iceberg v3-Tabellen gelten, finden Sie unter Hinweise und Einschränkungen zu Iceberg v3-Features.

Verwenden der Zeilenherkunft bei Iceberg-Tabellen

Bemerkung

Weitere Features von Iceberg v3, die in dieser Vorschau unterstützt werden, finden Sie unter Apache Iceberg™-Tabellen: Unterstützung für Apache Iceberg™ v3 (Vorschau).

Mit dieser Vorschau wird die Unterstützung des Features Zeilenherkunft für Apache Iceberg™-Tabellen eingeführt. Mit diesem Feature werden die folgenden Spalten von Snowflake automatisch in eine Iceberg-Tabelle geschrieben:

  • _row_id

  • _last_updated_sequence_number

Mit diesem Feature können Abfrage-Engines zuverlässig dieselbe Zeile über Snapshots hinweg abgleichen und Änderungen auf Zeilenebene erkennen. Weitere Informationen dazu finden Sie unter Zeilenherkunft.

Dieses Feature wird sowohl für von Snowflake verwaltete als auch für extern verwaltete Iceberg-Tabellen unterstützt.

Wichtig

Um die Zeilenherkunft bei Iceberg-Tabellen verwenden zu können, müssen die Tabellen v3 der Apache Iceberg™-Tabellenspezifikation entsprechen. Eine Anleitung zum Konfigurieren der Iceberg-Version für Tabellen finden Sie unter Konfigurieren der Iceberg-Standardversion.

Hinweise und Einschränkungen für die Zeilenherkunft

Die Zeilenherkunft wird in Streams unter Berücksichtigung der folgenden Punkte unterstützt:

  • Nur-Anfügen-Streams und Standard-Streams werden für von Snowflake verwaltete Iceberg v3-Tabellen unterstützt.

  • Nur-Einfügen-Streams und Standard-Streams werden für extern verwaltete Iceberg v3-Tabellen unterstützt.

    • Damit Standard-Streams die korrekten Ergebnisse liefern, muss die externe Engine unter Berücksichtigung der Iceberg v3-Spezifikation in Iceberg v3-Tabellen schreiben. Insbesondere sollten neu eingefügte Zeilen über _row_id=NULL verfügen. Zeilen, die während Copy-on-Write kopiert werden, sollten die _row_id beibehalten.

    • MAX_DATA_EXTENSION_TIME_IN_DAYS funktioniert nicht bei extern verwalteten Iceberg v3-Tabellen.

  • Wenn DMLs über Transaktionen mit mehreren Anweisungen bestätigt werden, haben Nur-Anfügen-Streams auf Iceberg v3-Tabellen eine andere Semantik als Iceberg v2-Tabellen:

    • Wenn in Iceberg v2 bei Nur-Anfügen-Streams eine Zeile in einer Transaktion mit mehreren Anweisungen hinzugefügt und dann gelöscht wird, wird diese Zeile als Einfügung betrachtet.

    • In Iceberg v3 wird diese Zeile bei Nur-Anfügen-Streams nicht als Einfügung behandelt.

Diese Hinweise und Einschränkungen gelten für die Zeilenherkunft, die ein Feature von Iceberg v3 ist. Eine Liste der Hinweise und Einschränkungen, die für alle Iceberg v3-Tabellen gelten, finden Sie unter Hinweise und Einschränkungen zu Iceberg v3-Features.