Erläuterungen zum Aktualisieren von dynamischen Tabellen

Die Inhalte dynamischer Tabellen basieren auf den Ergebnissen bestimmter Abfragen. Wenn sich die zugrunde liegenden Daten, auf denen die dynamische Tabelle basiert, ändern, wird die Tabelle aktualisiert, um diese Änderungen widerzuspiegeln. Diese Aktualisierungen werden als Auffrischung (engl. refresh) bezeichnet. Dieser Prozess ist automatisiert und umfasst die Analyse der Abfrage, die der Tabelle zugrunde liegt. Die folgenden Abschnitte erklären, wie dynamische Tabellen aktualisiert werden und wie mit der SELECT-Anweisung für eine dynamische Tabelle der Typ der Aktualisierung bestimmt werden kann.

Initialisierung dynamischer Tabellen

Wenn eine dynamische Tabelle mit einer CREATE DYNAMIC TABLE-Anweisung erstellt wird, wird die dynamische Tabelle zunächst mit Daten aus den zugrunde liegenden Tabellen gefüllt. Nach dem Erstellen durchläuft die dynamische Tabelle eine vollständige Aktualisierung, einschließlich dynamischer Tabellen mit nachgelagerter Verzögerung (Lag). Die Aktualisierung stellt die Isolation des Snapshots sicher, wobei alle beteiligten dynamischen Tabellen synchronisiert werden, und sie spart Kosten, da keine Datenauffrischungen bei den vorgelagerten dynamischen Tabellen erforderlich sind.

Diese erstmalige Aktualisierung kann einige Zeit in Anspruch nehmen, vor allem, wenn ein umfangreiches Scannen der Daten erforderlich ist. Die Dauer für das Erstellen der dynamischen Tabellen hängt von der Größe der gescannten Daten ab. Um den Fortschritt zu verfolgen, können Sie den Aktualisierungsverlauf mit information_schema.dynamic_table_refresh_history() abfragen und mit refresh_trigger = INITIAL nach Einträgen suchen.

Wenn die Initialisierung fehlschlägt, wird der Erstellungsprozess der Tabellen angehalten, wodurch eine sofortige Rückmeldung zu fehlerhaften Definitionen bereitgestellt wird. Während der Initialisierung einer neuen Version einer bestehenden dynamischen Tabelle bleibt die bestehende Version so lange zugänglich, bis die neue Version verfügbar ist, wodurch sichergestellt wird, dass das Scheitern der Erstellung einer neuen Version keine Auswirkungen auf die aktuelle Instanz hat.

Typen der Aktualisierung dynamischer Tabellen

Die Aktualisierung einer dynamischen Tabelle kann auf eine von zwei Arten erfolgen:

  1. Inkrementelle Aktualisierung: Dieser automatische Prozess analysiert die Abfrage der dynamischen Tabelle und berechnet die Änderungen seit der letzten Aktualisierung. Anschließend werden diese Änderungen in die Tabelle eingefügt. Weitere Informationen zu unterstützten Abfragen finden Sie unter Abfragetypen, die inkrementelle Aktualisierungen unterstützen.

  2. Vollständige Aktualisierung: Wenn der automatisierte Prozess keine inkrementelle Aktualisierung ausführen kann, wird eine vollständige Aktualisierung ausgeführt. Dabei wird die Abfrage für die dynamische Tabelle ausgeführt und die vorherigen materialisierten Ergebnisse werden vollständig ersetzt.

Die in der Abfrage verwendeten Konstrukte bestimmen, ob eine inkrementelle Aktualisierung verwendet werden kann. 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.

Erläuterungen zur Zielverzögerung

Die Aktualisierung dynamischer Tabellen wird ausgelöst, je nachdem, wie veraltet die Daten sind, was gemeinhin als Verzögerung (engl. lag) oder Zielverzögerung (engl. target lag) bezeichnet wird.

Für das Angeben der Zielverzögerung gibt es zwei Möglichkeiten:

  1. Measure der Aktualität: Definiert die maximale Zeitspanne, die der Inhalt der dynamischen Tabelle hinter den Aktualisierungen der Basistabellen zurückbleiben darf.

    Wird mit dem Parameter TARGET_LAG = { num { seconds | ... | days } bei der Änderung oder bei der ursprünglichen Definition einer dynamischen Tabelle angegeben.

  2. DOWNSTREAM: Gibt an, dass die dynamische Tabelle bei Bedarf aktualisiert werden soll, wenn andere dynamische Tabellen, die von ihr abhängen, aktualisiert werden müssen. Aktualisierungen sind abgeleitet von vorgelagerten Datenbankobjekten. Dynamische Tabellen, die nachgelagert (Downstream) sind, werden nur aktualisiert, wenn sie von vorgelagerten Verbrauchern benötigt werden.

Betrachten Sie das folgende Beispiel, bei dem die dynamische Tabelle 2 (DT2) auf der Grundlage der dynamischen Tabelle 1(DT1) definiert wird. DT2 muss von DT1 lesen, um seine Inhalte zu materialisieren. Darüber hinaus nutzt ein Bericht über eine Abfrage Daten aus DT2.

Simple example of two dynamic tables, DT2 which is defined based on DT1.

Die folgenden Ergebnisse sind möglich, je nachdem, wie jede dynamische Tabelle ihre Verzögerung angibt:

Dynamische Tabelle 1 (DT1)

Dynamische Tabelle 2 (DT2)

Ergebnisse der Aktualisierung

TARGET_LAG = DOWNSTREAM

TARGET_LAG = 10minutes

DT2 wird höchstens alle 10 Minuten aktualisiert. DT1 erhält (oder leitet ab) ihren Rückstand (Verzögerung) von DT2 und wird jedes Mal aktualisiert, wenn DT2 Aktualisierungen benötigt.

TARGET_LAG = 10minutes

TARGET_LAG = DOWNSTREAM

Dieses Szenario sollte vermieden werden. Die Berichtsabfrage wird keine Daten erhalten. DT2 wird nicht aktualisiert, da keine DT auf Basis von DT2 erstellt wird. Außerdem wird DT1 regelmäßig aktualisiert.

TARGET_LAG = 5minutes

TARGET_LAG = 10minutes

DT2 wird etwa alle 10 Minuten mit Daten von DT1 aktualisiert, die höchstens 5 Minuten alt sind.

TARGET_LAG = DOWNSTREAM

TARGET_LAG = DOWNSTREAM

DT2 wird nicht regelmäßig aktualisiert, da DT1 keine nachgelagerten Objekte mit einer bestimmten Verzögerung hat.

Abfragetypen, die inkrementelle Aktualisierungen unterstützen

In der Tabelle unten sind die Ausdrücke, Schlüsselwörter und Klauseln beschrieben, die derzeit inkrementelle Aktualisierungen unterstützen.

Bemerkung

Wenn die Abfrage Ausdrücke verwendet, die für eine inkrementelle Aktualisierung nicht unterstützt werden, verwendet der automatische Aktualisierungsprozess stattdessen eine vollständige Aktualisierung. Weitere Informationen dazu, wie Sie den verwendeten Aktualisierungsmodus feststellen können, finden Sie unter Feststellen, ob inkrementelle oder vollständige Aktualisierung verwendet wird.

Schlüsselwort/Klausel

Unterstützung für inkrementelle Aktualisierungen

WITH

Allgemeine Tabellenausdrücke (CTE), die inkrementelle Aktualisierungsfeatures verwenden, werden in der Unterabfrage unterstützt.

Ausdrücke in SELECT

Ausdrücke, einschließlich solcher, die deterministische integrierte Funktionen und unveränderliche benutzerdefinierte Funktionen verwenden.

FROM

Quelltabellen, Ansichten und andere dynamische Tabellen.

OVER

Alle Fensterfunktionen.

WHERE

Filter mit denselben Ausdrücken, die auch in SELECT gültig sind.

JOIN (und andere Ausdrücke zum Verknüpfen von Tabellen)

Dynamische Tabellen unterstützen derzeit nur Inner Joins, Outer Joins und Cross Joins für inkrementelle Aktualisierungen.

Bemerkung

Um inkrementelle Aktualisierungen zu verwenden, müssen Sie dynamische Tabellen neu erstellen, die andere Typen von Joins verwenden

Um festzustellen, ob Sie die dynamische Tabelle neu erstellen müssen, verwenden Sie eines der folgenden Verfahren zum Überprüfen, ob die dynamische Tabelle eine vollständige Aktualisierung verwendet:

Sie können in der Verknüpfung (Join) eine beliebige Anzahl von Tabellen angeben.

Aktualisierungen aller Tabellen in der Verknüpfung spiegeln sich in den Ergebnissen der Abfrage wider.

UNION ALL

Dynamische Tabellen unterstützen UNION ALL.

GROUP BY

Dynamische Tabellen unterstützen GROUP BY.

Wichtig

Das Ersetzen einer unveränderlichen UDF während der Verwendung durch eine dynamische Tabelle mit inkrementeller Aktualisierung führt zu einem undefinierten Verhalten in der dynamischen Tabelle, die von der UDF verwendet wird.

Derzeit werden die folgenden Konstrukte und Typen von Abfragen bei inkrementellen Aktualisierungen nicht unterstützt. Wenn Sie diese in der Abfrage angeben, verwendet der automatische Aktualisierungsprozess eine vollständige Aktualisierung (was zu höheren Kosten führen kann), um die Tabelle zu aktualisieren.

  • LATERAL JOINS

  • Unterabfragen außerhalb von FROM-Klauseln (zum Beispiel WHERE EXISTS)

  • Flüchtige (VOLATILE) benutzerdefinierte Funktionen

Aktualisieren von Daten, wenn dynamische Tabellen von anderen dynamischen Tabellen abhängen

Wenn die Verzögerung einer dynamischen Tabelle als Measure angegeben wird, ermittelt der automatische Aktualisierungsprozess den Zeitplan für die Aktualisierungen auf Grundlage der Zielverzögerungszeiten der dynamischen Tabellen. Der Prozess wählt den Zeitplan aus, der die angestrebten Verzögerungszeiten der Tabellen am besten erfüllt.

Bemerkung

Eine Zielverzögerung ist keine Garantie. Stattdessen ist es ein Ziel, das Snowflake zu erreichen versucht. Die Daten in dynamischen Tabellen werden innerhalb der Zielverzögerung so genau wie möglich aktualisiert. Die Zielverzögerung kann jedoch aufgrund von Faktoren wie der Größe des Warehouses, des Datenumfangs, der Komplexität der Abfrage und ähnlichen Faktoren überschritten 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.

Angenommen, eine dynamische Tabelle A hat eine Zielverzögerung von 2 Minuten und fragt eine dynamische Tabelle B ab, die eine Zielverzögerung von 1 Minute hat. Der Prozess könnte festlegen, dass A alle 96 Sekunden aktualisiert werden soll und B alle 48 Sekunden. Im Ergebnis könnte der Prozess folgenden Zeitplan anwenden:

Spezifischer Zeitpunkt

Dynamische Tabellen aktualisiert

2022-12-01 00:00:00

A, B

2022-12-01 00:00:48

B

2022-12-01 00:01:36

A, B

2022-12-01 00:02:24

B

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:

  • Die dynamische Tabelle A fragt die dynamischen Tabellen B und C ab.

  • Die dynamische Tabelle B hat eine Zielverzögerung von 5 Minuten.

  • Die dynamische Tabelle C hat eine Zielverzögerung von 1 Minute.

Das bedeutet, dass die Zielverzögerungszeit für A nicht kürzer als 5 Minuten sein darf (d. h. nicht kürzer als die längere der Verzögerungszeiten für B und C).

Wenn Sie die Verzögerung für A auf 5 Minuten einstellen, erstellt der Prozess einen Aktualisierungsplan mit folgenden Zielen:

  • Aktualisiere C häufig genug, um die Verzögerung unter 1 Minute zu halten.

  • Aktualisiere A und B zusammen und häufig genug, um deren Verzögerungen unter 5 Minuten zu halten.

  • Stelle sicher, dass die Aktualisierung von A und B mit einer Aktualisierung von C zusammenfällt, um die Isolation des Snapshots sicherzustellen.

Hinweis: Wenn die Aktualisierungen zu lange dauern, überspringt der Zeitplan möglicherweise Aktualisierungen, um auf dem neuesten Stand zu bleiben. Die Snapshot-Isolation bleibt jedoch erhalten.