Aktualisierungsgrenze für dynamische Tabellen¶
Verwenden Sie eine Aktualisierungsgrenze für dynamische Tabellen, um die Pipelines dynamischer Tabellen zu entkoppeln und gleichzeitig die Upstream-Ergebnisse zu lesen.
Wenn eine dynamische Tabelle auf eine andere verweist, werden die beiden zusammen als eine einzige Pipeline aktualisiert. Während dies in den meisten Szenarien funktioniert, gibt es bestimmte Anwendungsfälle, z. B. die Datenfreigabe über Teamgrenzen hinweg, bei denen die Anforderungen an die Datenaktualisierung variieren können. Sie können die beiden dynamischen Tabellen als unabhängig (und somit zu verschiedenen Pipelines gehörend) deklarieren, indem Sie die Upstream-Referenz in DYNAMIC_TABLE_REFRESH_BOUNDARY() einschließen. Die Snapshot-Isolation wird nur innerhalb einer einzigen Pipeline garantiert, sodass dynamische Tabellen über eine Aktualisierungsgrenze hinweg keine Snapshot-Isolation untereinander bieten.
Übersicht¶
Wenn eine dynamische Tabelle aus einer anderen dynamischen Tabelle liest, führt Snowflake standardmäßig Folgendes aus:
Aktualisiert beide Tabellen zusammen als Teil einer einzigen Pipeline.
Koordiniert die Aktualisierungen, sodass die Snapshot-Isolation für nachgelagerte dynamische Tabellen für alle vorgelagerten dynamischen Tabellen in der Pipeline gelten.
Setzt Regeln auf Pipeline-Ebene durch, wie z. B. Zielverzögerungsprüfungen.
In einigen Pipelines soll nicht jede Beziehung dazu führen, dass beide dynamischen Tabellen zusammen aktualisiert werden. Einige allgemeine Beispiele umfassen:
Teamübergreifende Pipelines, bei denen ein Team eine dynamische Tabelle veröffentlicht, die ein anderes Team nutzt, die nachgelagerte dynamische Tabelle aber die vorgelagerte Pipeline nicht beeinflussen oder erben sollte.
Inkrementelle Migrationen, bei denen Sie einen vorgelagerten Pipeline-Schritt in eine dynamische Tabelle konvertieren, aber nicht möchten, dass nachgelagerte Verbrauchende damit beginnen, Aktualisierungen zu koordinieren.
Dynamische-Tabelle-für-Ansicht-für-dynamische-Tabelle-Muster, bei dem eine dynamische Tabelle aus einer Ansicht liest, die eine andere dynamische Tabelle abfragt. Dieses Muster wird nicht unterstützt, es sei denn, die Ansicht ist in
DYNAMIC_TABLE_REFRESH_BOUNDARY()eingeschlossen.
Eine Aktualisierungsgrenze macht diese Trennung explizit: Eingaben innerhalb der Grenze werden als zu einer separaten Pipeline gehörend behandelt und wie reguläre Tabellen gelesen.
Syntax¶
Wobei:
object_nameDer Name einer Tabelle, Ansicht, dynamischen Tabelle oder eines allgemeinen Tabellenausdrucks (CTE).
Verwenden Sie dieses Schlüsselwort in der FROM /JOIN-Klausel (einschließlich innerhalb von CTEs und UNION-Zweige) einer dynamischen Tabellendefinition.
Beispiele¶
Das folgende Beispiel liest aus einer Ansicht, die eine andere dynamische Tabelle abfragt. Ohne eine Aktualisierungsgrenze wird das Erstellen einer dynamischen Tabelle, die aus einer Ansicht einer anderen dynamischen Tabelle liest, nicht unterstützt. Das Einschließen der Ansicht in DYNAMIC_TABLE_REFRESH_BOUNDARY() ermöglicht dieses Muster:
Im folgenden Beispiel wird eine direkt referenzierte dynamische Tabelle mit einer Ansicht verknüpft, deren vorgelagerte dynamische Tabelle nach einem längeren Zeitplan aktualisiert wird. Das Einschließen der Ansicht in DYNAMIC_TABLE_REFRESH_BOUNDARY() verhindert, dass die nachgelagerte dynamische Tabelle alle 5 Minuten die teure Upstream-Aktualisierung auslöst, während sie trotzdem die neueste verfügbare Version lesen kann. Die Snapshot-Isolation wird über die Aktualisierungsgrenze hinweg nicht garantiert:
Verhalten¶
Wie Aktualisierungsgrenzen Abhängigkeiten verändern¶
Wenn Sie eine Eingabe in DYNAMIC_TABLE_REFRESH_BOUNDARY() innerhalb einer dynamischen Tabellendefinition einschließen:
Diese Eingabe wird für diese Definition als Eingabe einer Aktualisierungsgrenze behandelt.
Alle dynamischen Tabellen, die von dieser Eingabe aus erreichbar sind, sind für diese Definition nicht in der Pipeline enthalten.
Bei der Aktualisierung liest die dynamische Tabelle diese Objekte in ihrer aktuellen Version und nicht mit dem in der Pipeline koordinierten Datenzeitstempel.
Infolgedessen:
- Keine kaskadierende Aktualisierung über die Grenze hinweg
Die Aktualisierung der nachgelagerten dynamischen Tabelle löst keine Aktualisierungen von dynamischen Tabellen aus, die nur über eine Aktualisierungsgrenze erreichbar sind.
- Unabhängige Zeitplanung
Die Zielverzögerung und die Aktualisierungsplanung für die nachgelagerte dynamische Tabelle ignorieren dynamische Tabellen, die nur über die Grenze erreichbar sind.
- Keine Snapshot-Isolation über die Grenze hinweg
Die nachgelagerte dynamische Tabelle liest jede Version der vorgelagerten Daten, die zum Aktualisierungszeitpunkt verfügbar ist. Es ist nicht garantiert, dass die Daten jenseits der Grenze mit der Snapshot-Isolation abgeglichen werden, die für andere vorgelagerte Abhängigkeiten gilt.
Snapshot-Isolation und Aktualisierungsgrenzen¶
Innerhalb einer einzelnen Pipeline (ohne Grenze) garantiert Snowflake die Snapshot-Isolation für alle vorgelagerten dynamischen Tabellen, die an dieser Pipeline beteiligt sind.
Aktualisierungsgrenzen schwächen absichtlich diese Garantie für die Abhängigkeit, die die Grenze überschreitet, ab:
Innerhalb der Grenze: Objekte werden entsprechend ihrer eigenen Pipelines aktualisiert und koordiniert.
Außerhalb der Grenze: Die nachgelagerte dynamische Tabelle liest jede Version, die zum Zeitpunkt der Aktualisierung verfügbar ist.
Eine einzige Definition einer dynamischen Tabelle kann daher auf beide Arten von Eingaben verweisen:
Direkte Verweise auf vorgelagerte dynamische Tabellen, die an der Snapshot-Isolation und koordinierten Aktualisierungen innerhalb der Pipeline beteiligt sind.
Verweise auf Aktualisierungsgrenzen, die die neueste verfügbare Version der vorgelagerten Daten unabhängig voneinander und ohne Snapshot-Isolation lesen.
Verwenden Sie Aktualisierungsgrenzen nur für Abhängigkeiten, bei denen Sie keine Snapshot-Isolation zwischen den vor- und nachgelagerten dynamischen Tabellen benötigen.
Anwendungsfälle¶
Entkoppeln von teamübergreifenden Pipelines¶
Verschiedene Teams können verschiedene Teile einer logischen Pipeline besitzen:
Team A: Veröffentlicht eine dynamische Kerntabelle, die in der gesamten Organisation verwendet wird.
Team B: Definiert eine nachgelagerte dynamische Tabelle, die die dynamische Kerntabelle mit teamspezifischen Daten verknüpft.
Team B kann die Ausgabe von Team A in eine Aktualisierungsgrenze einschließen, um:
zu vermeiden, dass die dynamischen Tabellen von Team A in die eigene Pipeline gezogen werden.
den eigenen Aktualisierungszeitplan unabhängig zu halten.
Behandeln Sie die dynamische Tabelle von Team A ähnlich wie eine externe, regelmäßig aktualisierte Tabelle.
Aktivieren der dynamischen Tabelle in der Ansicht der dynamischen Tabelle¶
Ohne eine Aktualisierungsgrenze wird das Erstellen einer dynamischen Tabelle, die aus einer Ansicht einer anderen dynamischen Tabelle liest, nicht unterstützt. Mit einer Aktualisierungsgrenze können Sie die Abhängigkeit der Ansicht explizit als Grenze markieren:
Hier gilt für order_summary_dt Folgendes:
Liest aus
orders_dtüber eine Aktualisierungsgrenze.Gehört nicht zur gleichen Pipeline wie
orders_dt.Liest bei einer Aktualisierung jede verfügbare Version von
orders_dt.
Beispiel: Ansicht einer teameigenen Grenze¶
Ein allgemeines Muster besteht darin, dass ein Team sowohl über eine dynamische Tabelle als auch über eine Ansicht verfügt und die Aktualisierungsgrenze innerhalb der Ansichtsdefinition anwendet. Andere Teams verbrauchen dann diese Ansicht, ohne neue Abhängigkeiten für die dynamische Tabelle des besitzenden Teams einzuführen.
Bei diesem Muster:
Team A steuert die Aktualisierungsgrenze durch Einschließen von
product_catalog_dtin``product.active_products_public_v``.Team B und andere Teams definieren ihre eigenen dynamischen Tabellen, die nur auf die veröffentlichte Ansicht verweisen.
Diese nachgelagerten dynamischen Tabellen fügen
product_catalog_dtnicht zu ihrer eigenen Pipeline hinzu;``product_catalog_dt`` bleibt außerhalb ihrer Pipelines, obwohl die Daten über die Ansicht sichtbar sind.
Inkrementelle Migration zu dynamischen Tabellen¶
Wenn Sie einen bestehenden Pipeline-Schritt in eine dynamische Tabelle migrieren, möchten Sie möglicherweise nicht, dass nachgelagerte Verbrauchende Folgendes tun:
Damit beginnen, Aktualisierungen der neuen dynamischen Tabelle auszulösen.
Übernehmen neuer Anforderungen an die Zielverzögerung.
Wenn Sie die neue dynamische Tabelle (oder eine Ansicht darüber) in eine Aktualisierungsgrenze einschließen, können nachgelagerte dynamische Tabellen diese nutzen, ohne derselben Pipeline hinzugefügt zu werden.
Zielverzögerung¶
Aktualisierungsgrenzen beeinflussen auch, wie die Zielverzögerung durchgesetzt wird.
Die Zielverzögerung einer vorgelagerten dynamischen Tabelle muss gleich sein oder kürzer als die jeder nachgelagerten dynamischen Tabelle innerhalb derselben Pipeline. Dynamische Tabellen, auf die über DYNAMIC_TABLE_REFRESH_BOUNDARY() verwiesen wird, gehören nicht zur gleichen Pipeline, sodass diese Regel nicht über die Grenze hinweg gilt.
Vorgelagerte dynamische Tabellen innerhalb einer Aktualisierungsgrenze behalten ihre eigene Zielverzögerung und Planungsverhalten; sie werden nicht durch nachgelagerte Entscheidungen über die Grenze hinweg verschärft oder gelockert.
Einschränkungen¶
Aktualisierungsgrenzen unterliegen einigen wichtigen Regeln:
** Dieselbe dynamische Tabelle sowohl innerhalb als auch außerhalb einer Aktualisierungsgrenze ist nicht zulässig**
Alle Verweise auf dieselbe vorgelagerte dynamische Tabelle innerhalb einer einzelnen Definition müssen entweder direkt in der Definition enthalten oder in DYNAMIC_TABLE_REFRESH_BOUNDARY() eingeschlossen sein. Das Mischen beider würde es ermöglichen, dieselbe dynamische Tabelle mit verschiedenen Versionen zu lesen. Snowflake blockiert diese Definitionen und gibt einen beschreibenden Fehler zurück.
Nicht unterstützte Grenzziele
DYNAMIC_TABLE_REFRESH_BOUNDARY() muss ein benanntes Objekt (Tabelle, Ansicht, dynamische Tabelle oder CTE) umschließen. Folgendes kann nicht umschlossen werden:
Inline-Unterabfragen
Tabellenfunktionen oder UDTFs.
Beliebig
TABLE(...)-Aufrufe
Auswirkung außerhalb dynamischer Tabellen
Sie können DYNAMIC_TABLE_REFRESH_BOUNDARY() in regulären SELECT-Abfragen aufrufen, aber außerhalb einer dynamischen Tabellendefinition ist dies eine „NoOps“-Anweisung (keine Operation).
Best Practices¶
Bei Verwendung von Aktualisierungsgrenzen in Pipelines dynamischer Tabellen:
Verwenden Sie eine Aktualisierungsgrenze in folgenden Situationen:
Sie möchten die dynamische Tabelle eines anderen Teams nutzen, ohne dessen Pipeline beizutreten.
Sie benötigen keine Snapshot-Isolation von einer bestimmten vorgelagerten Abhängigkeit.
Eine dynamische Tabelle hängt von einer Ansicht ab, die auf eine andere dynamische Tabelle verweist. Dieses Muster wird nur unterstützt, wenn entweder die Ansicht oder die vorgelagerte dynamische Tabelle in
DYNAMIC_TABLE_REFRESH_BOUNDARY()eingeschlossen ist.
Vermeiden Sie eine Aktualisierungsgrenze in folgenden Situationen:
Sie benötigen eine Snapshot-Isolation über diese Abhängigkeit hinweg.
Sie möchten, dass nachgelagerte Aktualisierungen mit vorgelagerten dynamischen Tabellen koordiniert werden und dass Aktualisierungen bei Bedarf kaskadieren.
Sie verlassen sich auf globale Zielverzögerungsbeziehungen über die gesamte Pipeline hinweg.