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.

Timeouts beim Aktualisieren dynamischer Tabellen werden durch den Parameter STATEMENT_TIMEOUT_IN_SECONDS bestimmt, der die maximale Dauer für das Konto oder Warehouse festlegt, bevor die Aktualisierung automatisch abgebrochen wird.

In den folgenden Abschnitten wird das Aktualisieren dynamischer Tabellen näher erläutert:

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 Unterstützte Abfragen bei der inkrementellen Aktualisierung.

  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.

Einfaches Beispiel mit zwei dynamischen Tabellen, wobei DT2 auf Grundlage von DT1 definiert ist.

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.

Unterstützte Abfragen bei der inkrementellen Aktualisierung

In der Tabelle unten sind die Ausdrücke, Schlüsselwörter und Klauseln beschrieben, die derzeit inkrementelle Aktualisierungen unterstützen. Eine Liste der Abfragen, die inkrementelle Aktualisierungen nicht unterstützen, finden Sie unter Einschränkungen bei der Unterstützung der inkrementellen Aktualisierung.

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. Unterabfragen außerhalb von FROM-Klauseln (z. B. WHERE EXISTS)

OVER

Alle Fensterfunktionen.

WHERE/HAVING/QUALIFY

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

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

Zu den unterstützten Join-Typen für die inkrementelle Aktualisierung gehören Inner Joins, Outer-Equi Joins und Cross Joins. Sie können eine beliebige Anzahl von Tabellen in der Verknüpfung angeben, und Aktualisierungen aller Tabellen in der Verknüpfung werden in den Ergebnissen der Abfrage berücksichtigt.

UNION ALL

Dynamische Tabellen unterstützen UNION ALL.

GROUP BY

Dynamische Tabellen unterstützen GROUP BY.

Wichtig

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, wodurch zusätzliche Kosten entstehen können. Weitere Informationen dazu, wie Sie den verwendeten Aktualisierungsmodus feststellen können, finden Sie unter Feststellen, ob inkrementelle oder vollständige Aktualisierung verwendet wird.

Das Ersetzen einer IMMUTABLE-UDF (benutzerdefinierte Funktion), während sie von einer dynamischen Tabelle verwendet wird, die eine inkrementelle Aktualisierung verwendet, führt zu undefiniertem Verhalten in dieser Tabelle. VOLATILE-UDFs werden bei der inkrementellen Aktualisierung nicht unterstützt.

Unterstützte nicht deterministische Funktionen in vollständiger Aktualisierung

Die folgenden nicht deterministischen Funktionen werden in dynamischen Tabellen unterstützt. Beachten Sie, dass diese Funktionen nur für vollständige Aktualisierungen unterstützt werden. Eine Liste der nicht unterstützten Funktionen für die inkrementelle Aktualisierung finden Sie unter Einschränkungen bei der Unterstützung der inkrementellen Aktualisierung.

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.