Verwenden von Zeilenzeitstempeln, um die Latenz in Ihren Pipelines zu messen¶
Zeilenzeitstempel bieten eine genaue, chronologische Aufzeichnung, wann jede Zeile in einer Tabelle zuletzt aktualisiert wurde. Zeilen, die in derselben Transaktion geändert wurden, haben genau den gleichen Zeitstempel, und Zeilen, die in verschiedenen Transaktionen geändert wurden, sind nach dem Zeitpunkt geordnet, zu dem sie übertragen wurden.
Zu den wichtigsten Anwendungsfällen gehören die folgenden:
Pipeline-Beobachtung: Messen Sie die End-to-End-Latenz und die Datenaktualität für die Streaming-Erfassung, CDC- und ETL-Workloads mit höherer Genauigkeit als clientseitige Zeitstempel.
Zuverlässige inkrementelle Verarbeitung: Erfassen Sie verzögerte oder aufgefüllte Datensätze, die von Ereigniszeitstempeln möglicherweise übersprungen werden, mithilfe endgültiger Commit-Zeiten.
Definitionsprüfungsprotokolle: Legen Sie eine chronologische Reihenfolge der Ereignisse für die Einhaltung gesetzlicher Vorschriften oder Meilensteine im SCD2-Stil fest.
Um Zeilenzeitstempel für Ihre Tabellen festzulegen, wählen Sie eine der folgenden Optionen aus:
Zeilenzeitstempel für eine Tabelle festlegen: Verwenden Sie eine Rolle, die die Berechtigung OWNERSHIP für die Tabelle hat. Legen Sie die ROW_TIMESTAMP-Eigenschaft auf TRUE fest, wenn Sie den Befehl CREATE TABLE oder ALTER TABLE ausführen.
Beispiel:
CREATE TABLE … ROW_TIMESTAMP = TRUEoderALTER TABLE … SET ROW_TIMESTAMP = TRUEZeilenzeitstempel für neue Tabellen in einem Container standardmäßig festlegen: Legen Sie die ROW_TIMESTAMP_DEFAULT-Eigenschaft für den Container auf TRUE fest.
Beispiel:
ALTER SCHEMA … SET ROW_TIMESTAMP_DEFAULT = TRUEbedeutet, dass in jeder neuen Tabelle, die nach der Einstellung des Parameters im Schema erstellt wird, standardmäßig Zeitstempel für Zeilen aktiviert sind.Massenaktivierung von Zeilenzeitstempeln für bestehende Tabellen: Verwenden Sie die Systemfunktion SELECT SYSTEM$SET_ROW_TIMESTAMP_ON_ALL_SUPPORTED_TABLES.
Beispiel:
SELECT SYSTEM$SET_ROW_TIMESTAMP_ON_ALL_SUPPORTED_TABLES('schema', '{my_db}.my_schema').Das erste Argument ist Level: eins von
schema,:code:databaseoderaccount.Das zweite Argument ist der vollqualifizierte Name des Containers.
Diese Funktion fügt die Spalte mit dem Zeilenzeitstempel zu allen bestehenden in Frage kommenden Tabellen innerhalb des Containers hinzu und stellt sicher, dass neu erstellte Tabellen automatisch den Zeilenzeitstempel aktiviert haben.
Um die Funktion erfolgreich auszuführen, benötigen Sie MODIFY-Berechtigungen für den Container, für den Sie die Funktion aufrufen.
Nachdem Zeilenzeitstempel aktiviert wurden, legen die Tabellen die METADATA$ROW_LAST_COMMIT_TIME-Spalte offen, die den Zeitstempel zurückgibt, wann jede Zeile zuletzt geändert wurde. Dies ermöglicht die Änderungsverfolgung, die inkrementelle Verarbeitung und Time Travel-Abfragen auf Basis der Zeilenänderungszeit.
Bemerkung
In einem Datenfreigabe-Szenario können Verbrauchende METADATA$ROW_LAST_COMMIT_TIME nicht auswählen, auch wenn in der Erstellertabelle der Zeilenzeitstempel aktiviert ist. Die Erstellenden müssen eine Ansicht erstellen, die METADATA$ROW_LAST_COMMIT_TIME auswählt und dann die Ansicht freigeben, wenn Sie Zeilenzeitstempel für Verbrauchende freigeben möchten.
Die folgenden Anweisungen zeigen, wie eine Tabelle erstellt wird, die Zeilenzeitstempel unterstützt. Die Anweisungen fügen Daten in die Tabelle ein und rufen den Zeitstempel jeder Zeile ab.
CREATE OR REPLACE TABLE table1(value1 STRING)
ROW_TIMESTAMP = TRUE;
INSERT INTO table1 VALUES('some-value-a');
INSERT INTO table1 VALUES('some-value-b');
SELECT METADATA$ROW_LAST_COMMIT_TIME AS row_timestamp, *
FROM table1
ORDER BY 1;
Primäre Anwendungsfälle¶
Die METADATA$ROW_LAST_COMMIT_TIME-Spalte mit Metadaten hilft beim Verfolgen der Latenz. Wenn Sie z. B. eine Gesamtlatenz von fünf Sekunden ansteuern möchten, hilft Ihnen diese Spalte, den Beitrag von Snowflake zu dieser Latenz zu ermitteln.
Zu den wichtigen Anwendungsfällen gehören:
Messen der Datenaufnahme-Latenz: Verfolgen Sie die Zeit zwischen dem Erstellen einer Zeile auf dem Client und dem Zeitpunkt, an dem sie in Snowflake sichtbar wird, sodass Benutzende die Datenaufnahmezeit berechnen können.
Messen der End-to-End-Latenz: Kombinieren Sie die Datenaufnahmelatenz und die Pipeline-Latenz, um die Gesamtzeit von der Datengenerierung bis zu ihrem Endzustand zu messen.
Messen der Pipeline-Latenz: Verfolgt Zeitstempel, während sich Daten durch eine Pipeline bewegen. Durch den Vergleich des Zeitstempels der ursprünglichen Tabelle mit der endgültigen Tabelle können Benutzende messen, wieviel Zeit die Pipeline für die Verarbeitung der Daten benötigt.
Wird für Pipelines unterstützt, die auf Streams, dynamischen Tabellen und Aufgaben basieren.
Beispiel: Messen der Datenaufnahmelatenz¶
Zum Messen der Datenaufnahmelatenz mithilfe der METADATA$ROW_LAST_COMMIT_TIME-Spalte mit Metadaten gehen Sie wie folgt vor:
Erstellen Sie mit einer der folgenden Methoden eine Pipeline für die Datenaufnahme, die Daten an Snowflake sendet:
Snowpipe Streaming Ingest SDK. Ein einfaches Beispiel, das die Verwendung des Client-SDK zum Erstellen einer Snowpipe Streaming-Anwendung zeigt, finden Sie in dieser Java-Datei (GitHub).
Befehl COPY INTO <Tabelle>
Führen Sie den folgenden Befehl aus:
ALTER SESSION SET TIMESTAMP_TZ_OUTPUT_FORMAT = 'YYYY-MM-DDTHH:MI:SS.FF3 TZH'; ALTER SESSION SET TIMEZONE = 'UTC'; CREATE OR REPLACE DATABASE mydb; CREATE OR ALTER SCHEMA myschema; CREATE OR REPLACE TABLE table1(record_id STRING, client_timestamp TIMESTAMP_LTZ); -- The rows inserted from server-side-insert-1 up to this point will not have a valid METADATA$ROW_LAST_COMMIT_TIME timestamp. INSERT INTO table1 VALUES('server-side-insert-1', current_timestamp());
Ändern Sie die Tabelle, um das METADATA$ROW_LAST_COMMIT_TIME-Feature zu aktivieren.
ALTER TABLE table1 SET ROW_TIMESTAMP = TRUE;
Erfassen Sie Daten, die die Spalten
record_idundclient_timestampin Ihrer Snowflake-Tabelle enthalten, indem Sie die in Schritt 1 definierte Datenaufnahme-Pipeline verwenden:Fügen Sie eine neue Zeile als sofortiges Beispiel ein, wenn Sie keine Datenaufnahme-Pipeline verwenden. Im Gegensatz zur Einfügung in Schritt 2 hat diese Einfügung einen gültigen METADATA$ROW_LAST_COMMIT_TIME-Zeitstempel, da die Tabelleneigenschaft aktiviert ist.
INSERT INTO table1 VALUES('server-side-insert-2', current_timestamp());
Führen Sie Ihr clientseitiges Programm erneut aus, und gehen Sie dann wie folgt vor:
SELECT *, METADATA$ROW_LAST_COMMIT_TIME AS ROW_TIMESTAMP, TIMESTAMPDIFF(ms, CLIENT_TIMESTAMP, ROW_TIMESTAMP) AS INGEST_LATENCY FROM table1 ORDER BY 2;
Sekundäre Anwendungsfälle¶
Zeilenzeitstempel können auch in den folgenden Fällen verwendet werden:
Datenaufbewahrung: Zeilenzeitstempel können helfen, alte Datensätze zu löschen, um Speicherkosten zu sparen.
Ereignisreihenfolge und Änderungsverfolgung: Sie können Zeilenzeitstempel verwenden, um Änderungen zu verfolgen. Die Zeile mit dem größten Zeitstempel stellt die letzte Änderung dar.
Nur Daten anhängen: Wenn Zeilen nur angehängt werden, können Zeilenzeitstempel dabei helfen, nach Tabellenstatus zu bestimmten Zeitpunkten zu filtern, sodass Sie Time Travel unabhängig von den Datenaufbewahrungsrichtlinien verwenden können.
Einschränkungen und Hinweise¶
Für Zeilenzeitstempel ist nur innerhalb derselben Tabelle die Beibehaltung der chronologischen Reihenfolge garantiert, außer im Falle eines Failovers, bei dem die Reihenfolge nicht garantiert ist. Eine Sortierung über Tabellen, verschiedene Regionen oder andere Zeitquellen hinweg kann nicht garantiert werden. Sie sollten keine Zeilenzeitstempel über verschiedene Tabellen oder andere Quellen hinweg vergleichen, da dies zu Inkonsistenzen führen kann.
Zeilenzeitstempel geben den Zeitpunkt der letzten Aktualisierung wieder, nicht den Erstellungszeitpunkt. Wenn beispielsweise die Datenzeile nach dem Commit aktualisiert wird, gibt der Zeitstempel der Zeile den Zeitpunkt der letzten Aktualisierung wieder und nicht den Erstellungszeitpunkt der Daten.
Zeitstempel für Zeilen, die erstellt wurden, bevor die Zeilenzeitstempel für eine Tabelle aktiviert wurden, werden auf NULL festgelegt.
Zeilenzeitstempel werden so lange gespeichert, wie die Zeilen gespeichert sind.
Durch das Festlegen der ROW_TIMESTAMP-Eigenschaft auf FALSE werden alle gespeicherten METADATA$ROW_LAST_COMMIT_TIME-Werte dauerhaft gelöscht. Bei erneuter Aktivierung werden sie nicht wiederhergestellt, und Time Travel-Abfragen geben nichts zurück.
Zeilenzeitstempel werden für Apache Iceberg™-Tabellen, externe Tabellen, Hybridtabellen, Streams oder Ansichten nicht unterstützt.
Die Spalte METADATA$ROW_LAST_COMMIT_TIME mit Metadaten kann nicht im Folgenden referenziert werden:
CHANGES-Klausel.
Richtlinien, einschließlich Zeilen- oder Spaltenzugriffsrichtlinien und Lebenszyklusrichtlinien des Speichers
Einschränkungen
CLUSTER BY-Ausdrücke
Zeilenzeitstempel können nicht durch die Wiederherstellung der Archivtabelle wiederhergestellt werden. Als Problemumgehung können Sie METADATA$ROW_LAST_COMMIT_TIME als persistente Spalte einer anderen Tabelle materialisieren, die bei der Archivwiederherstellung verwendet werden soll.
Hinweise zum Klonen von Zeilenzeitstempeln¶
Beim Klonen einer Tabelle bleiben die Zeitstempel der Zeilen genau erhalten. Operationen, die eine physische Kopie von Daten erstellen, wie z. B. CREATE TABLE AS SELECT (CTAS) und INSERT INTO … SELECT, weisen neue Zeilenzeitstempel zu, die angeben, wann die Kopie erstellt wurde. Die ursprünglichen Zeilenzeitstempel aus der Quelltabelle bleiben nicht erhalten. Wenn Sie einen Datensatz davon beibehalten möchten, wählen Sie sie explizit in eine persistente Spalte aus, wie im folgenden Beispiel gezeigt:
CREATE TABLE my_archive AS
SELECT *, METADATA$ROW_LAST_COMMIT_TIME AS original_commit_time
FROM my_source_table;