Initialisierung und Aktualisierung dynamischer Tabellen verstehen¶
Der Inhalt einer dynamischen Tabelle wird durch eine Abfrage definiert und automatisch aktualisiert – Aktualisierung genannt – wenn sich die zugrunde liegenden Daten ändern. Dieser Prozess analysiert die Abfrage, um die Tabelle auf dem neuesten Stand zu halten.
In den folgenden Abschnitten wird das Aktualisieren dynamischer Tabellen näher erläutert:
Abschnitt |
Beschreibung |
---|---|
Führt die Initialisierung ein, d. h. die anfängliche Datenbefüllung, wenn Sie eine dynamische Tabelle erstellen. Sie können festlegen, wann die erste Aktualisierung erfolgt. |
|
Ein Überblick über die Aktualisierung dynamischer Tabellen. Dynamische Tabellen werden nach einem Zeitplan aktualisiert, sofern sie nicht manuell aktualisiert werden. |
|
Dynamische Tabellen unterstützen zwei Aktualisierungsmodi: inkrementell und vollständig. Sie können den Aktualisierungsmodus entweder auf AUTO einstellen oder ihn explizit festlegen. Erfahren Sie mehr über Best Practices für die Auswahl des Aktualisierungsmodus und darüber, wie Sie den verwendeten Aktualisierungsmodus anzeigen können. |
|
Aktualisierung von Daten, wenn eine dynamische Tabelle von anderen abhängt |
Erfahren Sie, wie dynamische Tabellen in Abhängigkeit von ihren Abhängigkeiten aktualisiert werden. |
Erläuterungen zu den Auswirkungen von Änderungen an Spalten in Basistabellen |
Erfahren Sie mehr über die Auswirkungen von Änderungen an Basistabellen. |
Eine Liste der Best Practices für die Aktualisierung dynamischer Tabellen. |
Erläuterungen zur Initialisierung dynamischer Tabellen¶
Wenn Sie eine dynamische Tabelle erstellen, erfolgt ihre erste Aktualisierung entweder synchron bei der Erstellung oder zu einem geplanten Zeitpunkt. Die erstmalige Datenbefüllung oder Initialisierung hängt davon ab, wann diese erste Aktualisierung stattfindet.
Dynamische Tabellen werden auf der Grundlage der angegebenen Zielverzögerung aktualisiert. Diese legt die maximal zulässige Verzögerung zwischen Aktualisierungen der Basistabellen und dem Inhalt der dynamischen Tabelle fest. Wenn Sie INITIALIZE = ON_CREATE
(Standard) einstellen, wird die Tabelle sofort initialisiert. Wenn Sie INITIALIZE = ON_SCHEDULE
einstellen, erfolgt die Initialisierung innerhalb des angegebenen Zeitrahmens für die Zielverzögerung.
Nehmen wir zum Beispiel eine dynamische Tabelle, DT1
, mit einer Zielverzögerung von 30 Minuten. Die Grundgesamtheit der Daten für DT1
kann wie folgt aussehen:
Wenn
DT1
so eingestellt ist, dass sie bei der Erstellung synchron aktualisiert wird (ON_CREATE
), wird sie bei der Erstellung initialisiert.Wenn
DT1
so eingestellt ist, dass sie zu einer geplanten Zeit aktualisiert wird (ON_SCHEDULE
), wird sie innerhalb von 30 Minuten initialisiert.
In Szenarien mit nachgelagerten Abhängigkeiten hängt das Aktualisierungsverhalten von den Abhängigkeiten ab. Wenn zum Beispiel die dynamische Tabelle DT1
eine nachgelagerte Zielverzögerung hat und DT2
, die von DT1
abhängt, eine Zielverzögerung von 30 Minuten hat, wird DT1
nur aktualisiert, wenn DT2
aktualisiert wird.
DT1
:
Wenn Sie bei der Erstellung eine synchrone Aktualisierung einstellen, wird sie sofort initialisiert. Wenn die Initialisierung fehlschlägt, wird der Erstellungsprozess angehalten und es wird sofort eine Fehlermeldung angezeigt.
Wenn Sie die Aktualisierung zu einem bestimmten Zeitpunkt festlegen, hängt die Initialisierung davon ab, wann
DT2
aktualisiert wird.
Die Initialisierung kann einige Zeit dauern, je nachdem, wie viele Daten gescannt werden. Um den Fortschritt zu verfolgen, siehe Probleme beim Erstellen dynamischer Tabellen lösen.
Manuelle und geplante Aktualisierungsoptionen verstehen¶
Dynamische Tabellen werden nach einem Zeitplan aktualisiert, der von der Zielverzögerung bestimmt wird. Jedes Mal, wenn eine dynamische Tabelle gelesen wird, liegt die Datenaktualität innerhalb des durch die Zielverzögerung definierten Zeitraums.
Sie können Ihre dynamischen Tabellen manuell mit dem Befehl ALTER DYNAMIC TABLE … REFRESH oder Snowsight aktualisieren, um die neuesten Daten zu erhalten. Weitere Informationen dazu finden Sie unter Dynamische Tabellen manuell aktualisieren.
Zeitüberschreitungen bei der Aktualisierung von dynamischen Tabellen werden durch den Parameter STATEMENT_TIMEOUT_IN_SECONDS gesteuert, der die maximal zulässige Dauer auf Konto- oder Warehouse-Ebene festlegt, bevor eine Aktualisierung automatisch abgebrochen wird.
Auswirkung der Zielverzögerung auf geplante Aktualisierungen¶
Die Zielverzögerung steuert die Häufigkeit der geplanten Aktualisierungen. Um Aktualisierungen manuell zu verwalten, setzen Sie die Zielverzögerung Ihrer dynamischen Tabelle auf DOWNSTREAM und stellen Sie sicher, dass alle nachgelagerten dynamischen Tabellen ebenfalls auf DOWNSTREAM gesetzt sind.
Wenn Sie die Zielverzögerung des gesamten gerichteten azyklischen Graphen (DAG) auf DOWNSTREAM setzen, werden geplante Aktualisierungen im Wesentlichen deaktiviert, da die endgültige dynamische Tabelle den Aktualisierungszeitplan steuert. Wenn keine dynamische Tabelle eine zeitbasierte Zielverzögerung hat, wird die Pipeline für geplante Aktualisierungen ausgesetzt. In diesem Fall werden durch die manuelle Aktualisierung der am weitesten nachgelagerten Tabelle automatisch alle vorgelagerten Abhängigkeiten aktualisiert.
Wenn Sie die Zielverzögerung auf DOWNSTREAM einstellen, werden keine genauen Zeiten angegeben. Stattdessen wählt Snowflake eine Aktualisierungskadenz, um zu versuchen, die Verzögerung unter dem Zielwert zu halten. Eine dynamische Tabelle mit einer Zielverzögerung von 4 Stunden könnte zum Beispiel alle 3,5 Stunden aktualisiert werden.
Als Problemumgehung können Sie eine Aufgabe mit einem CRON-Zeitplan verwenden. Beispiel:
CREATE TASK my_task
SCHEDULE = 'USING CRON <expr> <time_zone>'
AS
ALTER DYNAMIC TABLE my_dynamic_table REFRESH;
Aktualisierungsmodi für dynamische Tabellen¶
Dynamische Tabellen unterstützen zwei Aktualisierungsmodi: inkrementell und vollständig. Sie können den Aktualisierungsmodus entweder auf AUTO einstellen oder ihn explizit festlegen:
AUTO-Aktualisierungsmodus: Wenn Sie den Parameter
AUTO
verwenden, wählt Snowflake automatisch den kosten- und zeiteffizientesten Aktualisierungsmodus auf der Grundlage der Komplexität der Abfrage, der unterstützten Konstrukte, Operatoren, Funktionen und der erwarteten Leistung. Wenn die inkrementelle Aktualisierung nicht unterstützt wird oder wahrscheinlich schlecht funktioniert, wählt Snowflake stattdessen automatisch die vollständige Aktualisierung.Inkrementeller Aktualisierungsmodus: Dieser Modus analysiert die Abfrage der dynamischen Tabelle und berechnet die Änderungen seit der letzten Aktualisierung. Anschließend werden diese Änderungen in die Tabelle eingefügt.
Vollständiger Aktualisierungsmodus: In diesem Modus wird die Abfrage der dynamischen Tabelle ausgeführt und die zuvor materialisierten Ergebnisse werden vollständig ersetzt.
Nachdem Sie eine dynamische Tabelle erstellt haben, können Sie die Tabelle überwachen, um festzustellen, ob zur Aktualisierung dieser Tabelle inkrementelle oder vollständige Aktualisierungen verwendet werden.
Best Practices für die Auswahl von Aktualisierungsmodi für dynamische Tabellen¶
Der beste Modus für die Leistung Ihrer dynamischen Tabellen hängt vom Volumen der Datenänderungen und der Komplexität der Abfrage ab. Außerdem hilft das Testen verschiedener Aktualisierungsmodi mit einem speziellen Warehouse dabei, die Kosten zu isolieren und die Leistung auf der Grundlage des tatsächlichen Workloads zu verbessern.
AUTO Aktualisierungsmodus: Das System versucht standardmäßig, eine inkrementelle Aktualisierung durchzuführen. Wenn die inkrementelle Aktualisierung nicht unterstützt wird oder keine gute Leistung erbringt, wählt die dynamische Tabelle stattdessen automatisch die vollständige Aktualisierung.
Wir empfehlen dringend die Verwendung von
AUTO
für die meisten Anwendungsfälle, da Snowflake damit das Aktualisierungsverhalten ohne manuelle Einstellung optimieren kann. Um ein konsistentes Verhalten zu gewährleisten, sollten Sie den Aktualisierungsmodus für alle Produktionstabellen explizit festlegen. Die Verhaltensweise vonAUTO
kann sich zwischen verschiedenen Snowflake-Versionen ändern, was bei Verwendung in Produktionspipelines zu unerwarteten Leistungsänderungen führen kann.
Inkrementelle Aktualisierung: Aktualisiert die dynamische Tabelle nur mit den Änderungen seit der letzten Aktualisierung. Dies ist ideal für große Datensets mit häufigen kleinen Aktualisierungen.
Am besten geeignet für Abfragen, die mit der inkrementellen Aktualisierung kompatibel sind (z. B. deterministische Funktionen, einfache Joins und grundlegende Ausdrücke in
SELECT
,WHERE
undGROUP BY
). Wenn nicht unterstützte Features vorhanden sind und der Aktualisierungsmodus auf inkrementell festgelegt ist, kann Snowflake die dynamische Tabelle nicht erstellen.Eine wichtige Methode zur Leistungsoptimierung bei der inkrementellen Aktualisierung ist die Beschränkung des Änderungsvolumens auf etwa 5 % der Quelldaten und das Clustering Ihrer Daten nach den Gruppierungsschlüsseln, um den Verarbeitungsaufwand zu verringern.
Bedenken Sie, dass bestimmte Kombinationen von Operationen, wie Aggregationen auf vielen Joins, möglicherweise nicht effizient ausgeführt werden.
Vollständige Aktualisierung: Verarbeitet das gesamte Datenset neu und aktualisiert die dynamische Tabelle mit dem vollständigen Abfrageergebnis. Verwenden Sie diese Funktion für komplexe Abfragen oder wenn erhebliche Datenänderungen eine vollständige Aktualisierung erfordern.
Nützlich, wenn eine inkrementelle Aktualisierung aufgrund komplexer Abfragen, nicht-deterministischer Funktionen oder größerer Änderungen in den Daten nicht unterstützt wird.
Um den besten Modus für Ihren Anwendungsfall zu ermitteln, experimentieren Sie mit automatischen Empfehlungen und den konkreten Aktualisierungsmodi (vollständig und inkrementell).
Wichtig
Dynamische Tabellen im inkrementellen Aktualisierungsmodus können nicht nachgelagert von dynamischen Tabellen mit vollständigem Aktualisierungsmodus liegen. Das liegt daran, dass der inkrementelle Aktualisierungsmodus nicht mit den vollständigen Zeilenänderungen kompatibel ist, die bei jeder Aktualisierung einer vorgelagerten Tabelle mit vollständiger Aktualisierung auftreten.
Informationen zum Verifizieren des Aktualisierungsmodus für Ihre dynamischen Tabellen finden Sie unter Aktualisierungsmodus von dynamischen Tabellen anzeigen.
Aktualisierungsmodus von dynamischen Tabellen anzeigen¶
Sie stellen den Aktualisierungsmodus ein, wenn Sie eine dynamische Tabelle erstellen. Nach der Erstellung können Sie mit einer Rolle, die über die notwendigen Berechtigungen verfügt, mit einer der folgenden Methoden überprüfen, ob Ihre dynamische Tabelle inkrementelle oder vollständige Aktualisierungen verwendet:
Führen Sie den Befehl SHOW DYNAMIC TABLES aus:
SHOW DYNAMIC TABLES;
In der Ausgabe:
Die Spalte
text
zeigt den vom Benutzer eingestellten Aktualisierungsmodus an.Die Spalte
refresh_mode
zeigt den aktuellen Aktualisierungsmodus an.Die
refresh_mode_reason
zeigt, warum der aktuelle Aktualisierungsmodus gewählt wurde.
Wählen Sie im Navigationsmenü Monitoring » Dynamic Tables aus, und wählen Sie dann Ihre dynamische Tabelle aus.
Sie können den Aktualisierungsmodus für die dynamische Tabelle in der Objektüberschrift oben auf der Seite sehen. Bei vollständigen Aktualisierungen wird der Grund für den Aktualisierungsmodus angezeigt, wenn Sie mit der Maus über den Modus fahren.
Aktualisierung von Daten, wenn eine dynamische Tabelle von anderen abhängt¶
Wenn die Verzögerung einer dynamischen Tabelle als Zeitmaß festgelegt wird, plant der automatische Aktualisierungsprozess die Aktualisierungen so, dass die Zielverzögerungszeiten bestmöglich eingehalten werden.
Um die Daten konsistent zu halten, wenn eine dynamische Tabelle von einer anderen abhängt, aktualisiert der Prozess alle dynamischen Tabellen in einem Konto zu kompatiblen Zeiten. Der Zeitpunkt der weniger häufigen Aktualisierungen stimmt mit dem Zeitpunkt der häufigeren Aktualisierungen überein. Wenn die Aktualisierungen zu lange dauern, überspringt der Planer möglicherweise Aktualisierungen, um auf dem neuesten Stand zu bleiben. Die Snapshot-Isolation bleibt jedoch erhalten.
Angenommen, die dynamische Tabelle DT1
hat eine Zielverzögerung von zwei Minuten und fragt die dynamische Tabelle DT2
ab, die eine Zielverzögerung von einer Minute hat. Der Prozess könnte festlegen, dass DT1
alle 96 Sekunden und DT2
alle 48 Sekunden aktualisiert werden soll. Im Ergebnis könnte der Prozess folgenden Zeitplan anwenden:
Spezifischer Zeitpunkt |
Dynamische Tabellen aktualisiert |
---|---|
2022-12-01 00:00:00 |
DT1, DT2 |
2022-12-01 00:00:48 |
DT2 |
2022-12-01 00:01:36 |
DT1, DT2 |
2022-12-01 00:02:24 |
DT2 |
Das bedeutet, dass Sie bei der Abfrage einer Menge von dynamischen Tabellen, die voneinander abhängen, zu jedem Zeitpunkt denselben „Snapshot“ der Daten in diesen Tabellen abfragen.
Beachten Sie, dass die Zielverzögerung einer dynamischen Tabelle nicht kürzer sein kann als die Zielverzögerung der dynamischen Tabellen, von denen sie abhängt. Folgendes wird angenommen:
DT1
fragt die dynamischen TabellenDT2
undDT3
ab.DT2
hat eine Zielverzögerung von fünf Minuten.DT3
hat eine Zielverzögerung von einer Minute.
Das bedeutet, dass die Zielverzögerung für DT1
nicht kürzer als fünf Minuten sein darf (d. h. nicht kürzer als die längere der Verzögerungszeiten für DT2
und DT3
).
Wenn Sie die Verzögerung für DT1
auf fünf Minuten einstellen, wird ein Aktualisierungsplan mit diesen Zielen erstellt:
Aktualisieren von
DT3
häufig genug, um die Verzögerung unter einer Minute zu halten.Aktualisieren von
DT1
undDT2
zusammen und häufig genug, um ihre Verzögerungen unter fünf Minuten zu halten.Stellen Sie sicher, dass die Aktualisierung von
DT1
undDT2
mit einer Aktualisierung vonDT3
zusammenfällt, um die Snapshot-Isolation zu gewährleisten.
Wichtig
Dynamische Tabellen im inkrementellen Aktualisierungsmodus können nicht nachgelagert von dynamischen Tabellen mit vollständigem Aktualisierungsmodus liegen. Das liegt daran, dass der inkrementelle Aktualisierungsmodus nicht mit den vollständigen Zeilenänderungen kompatibel ist, die bei jeder Aktualisierung einer vorgelagerten Tabelle mit vollständiger Aktualisierung auftreten.
Erläuterungen zu den Auswirkungen von Änderungen an Spalten in Basistabellen¶
Wenn sich die zugrunde liegenden Objekte, die mit einer dynamischen Tabelle verbunden sind, ändern, hat dies folgende Auswirkungen:
Änderung |
Auswirkung |
---|---|
|
Keine. Wenn der Basistabelle eine neue Spalte hinzugefügt wurde oder eine nicht genutzte Spalte gelöscht wurde, werden keine Aktionen ausgeführt, und die Aktualisierungen werden wie zuvor fortgesetzt. |
|
Reinitialisierung: Die erste Aktualisierung nach der Neuerstellung ist die Initialisierung. |
|
Künftige Aktualisierungen der dynamischen Tabelle werden fehlschlagen. Die dynamische Tabelle muss neu erstellt werden, um die Änderung zu berücksichtigen. |
Best Practices für das Aktualisieren dynamischer Tabellen¶
Dedizierte Warehouses für Aktualisierungen verwenden¶
Dynamische Tabellen benötigen ein virtuelles Warehouse, um Aktualisierungen auszuführen. Um ein klares Bild von den Kosten Ihrer dynamischen Tabellenpipelines zu erhalten, sollten Sie Ihre dynamischen Tabellen mit dedizierten Warehouses testen, sodass der Verbrauch des virtuellen Warehouses, das den dynamischen Tabellen vorbehalten ist, isoliert werden kann.
Weitere Informationen dazu finden Sie unter Erläuterungen zu den Kosten von dynamischen Tabellen.
Nachgelagerte Verzögerung verwenden¶
Eine nachgelagerte Verzögerung (Downstream Lag) zeigt an, dass die dynamische Tabelle aktualisiert werden sollte, wenn andere abhängige dynamische Tabellen aktualisiert werden müssen. Sie sollten die nachgelagerte Verzögerung aufgrund ihrer Benutzerfreundlichkeit und Kosteneffizienz als bewährtes Verfahren einsetzen. Ohne nachgelagerte Verzögerung würde die Verwaltung einer Kette komplexer dynamischer Tabellen erfordern, dass jeder Tabelle eine eigene Zielverzögerung zugewiesen und die zugehörigen Einschränkungen verwaltet werden, anstatt nur die Datenaktualität der letzten Tabelle zu überwachen.
Weitere Informationen dazu finden Sie unter Die Zielverzögerung dynamischer Tabellen verstehen.