Erläuterungen zu Unveränderlichkeitseinschränkungen¶
Mit Unveränderlichkeitseinschränkungen können Sie Teile einer dynamischen Tabelle als statisch markieren. Wenn Sie eine Unveränderlichkeitseinschränkung definieren, überspringt Snowflake diese Zeilen bei der Aktualisierung, was die Leistung verbessert, insbesondere bei Tabellen, die große Mengen historischer Daten enthalten.
Unveränderlichkeitseinschränkungen definieren Sie mit der IMMUTABLE WHERE-Klausel, wenn Sie eine dynamische Tabelle erstellen oder ändern. Die Klausel gibt eine Bedingung oder ein Prädikat an, das angibt, welche Zeilen unveränderlich sind.
Wichtige Verhaltensweisen:
Erstmalige Aktualisierung: Snowflake ignoriert das IMMUTABLE WHERE-Prädikat bei der ersten Aktualisierung, dieses gilt aber für alle nachfolgenden Aktualisierungen.
Modus der vollständigen Aktualisierung: Das Prädikat beschränkt die Neuberechnung auf die Zeilen, die die Bedingung nicht erfüllen.
Inkrementelle Aktualisierung: Streams und dynamische Tabellen mit inkrementeller Aktualisierung können aus dynamischen Tabellen mit vollständiger Aktualisierung lesen, für die Unveränderlichkeitseinschränkungen gelten.
Klonen und Replizieren: Snowflake kopiert IMMUTABLE WHERE-Einschränkungen ohne Beschränkungen.
Weitere Informationen zu Computekosten finden Sie unter Computekosten für Unveränderlichkeitseinschränkungen.
Wann Unveränderlichkeitseinschränkungen verwendet werden sollten¶
Unveränderlichkeitseinschränkungen sind in den folgenden Szenarien nützlich:
- Vermeiden der Neuverarbeitung historischer Daten
Wenn Ihre dynamische Tabelle historische Daten enthält, die Sie nicht erneut verarbeiten möchten, markieren Sie ältere Zeilen als unveränderlich.
- Optimieren des Modus der vollständigen Aktualisierung
Dynamische Tabellen, die den Modus der vollständigen Aktualisierung verwenden, berechnen normalerweise alle Zeilen bei jeder Aktualisierung neu. Unveränderlichkeitseinschränkungen beschränken die Neuberechnung auf die veränderbaren Zeilen, was den Aufwand erheblich reduziert, wenn die meisten Daten historische Daten sind.
- Erleichterung von inkrementellen nachgelagerten Aktualisierungen
Einige Abfragekonstrukte, wie z. B. benutzerdefinierte Python-Tabellenfunktionen, erfordern, dass die dynamische Tabelle im Modus der vollständigen Aktualisierung ausgeführt wird. Normalerweise verhindert dies, dass nachgelagerte Tabellen von der inkrementellen Aktualisierung profitieren. Wenn die vorgelagerte Tabelle Unveränderlichkeitseinschränkungen unterliegt, können nachgelagerte Tabellen immer noch von einer inkrementellen Verarbeitung profitieren.
Verwenden von Backfilling mit Unveränderlichkeit¶
Backfilling erweitert Unveränderlichkeitseinschränkungen. Backfilling ist eine Nullkopie-Operation, mit der Sie vorhandene Daten sofort in eine dynamische Tabelle kopieren können, ohne sie neu berechnen zu müssen. Verwenden Sie es, um bestehende Pipelines zu migrieren, die Definitionen dynamischer Tabellen zu ändern oder eine teure Initialisierung zu vermeiden, wenn Sie Tabellen mit historischen Daten aus mehreren Jahren erstellen.
Rückwirkend aufgefüllte Daten können sich bei zukünftigen Aktualisierungen nicht ändern.
Wenn Sie eine dynamische Tabelle mit sowohl IMMUTABLE WHERE als auch BACKFILL FROM erstellen:
Beim Backfilling wird der unveränderliche Bereich aus der Quelltabelle kopiert. Der unveränderliche Bereich besteht aus Zeilen, die mit der
IMMUTABLE WHERE-Bedingung übereinstimmen.Die Abfragedefinition berechnet den veränderbaren Bereich. Der veränderbare Bereich besteht aus Zeilen, die nicht der Bedingung entsprechen.
Interaktion mit Primärschlüsseleinschränkungen und eindeutigen Einschränkungen (RELY)¶
Dynamische Tabellen können :doc:` Primärschlüsseleinschränkungen und eindeutige Einschränkungen </sql-reference/constraints-overview>` mit der Eigenschaft RELY Eigenschaft aufweisen. Wenn beide der folgenden Punkte für eine dynamische Tabelle zutreffen:
Ein
IMMUTABLE WHERE-Prädikat ist festgelegt undFür mindestens eine Primärschlüsseleinschränkung oder eindeutige Einschränkung ist die Eigenschaft RELY festgelegt
In diesem Fall müssen die Spalten, auf die im Prädikat IMMUTABLE WHERE verwiesen wird, eine Teilmenge der Spalten sein, auf die in der Gruppe von allen Primärschlüsseleinschränkungen mit der Eigenschaft RELY und eindeutigen Einschränkungen mit der Eigenschaft RELY für diese Tabelle verwiesen wird. Nur Einschränkungen mit der Eigenschaft RELY sind in der Gruppe der zulässigen Spalten enthalten, sofern welche vorhanden sind. Betrachten Sie die folgenden Beispiele:
Wenn die Tabelle eine Primärschüsseleinschränkung mit RELY für Spalte
Aund eine eindeutige Einschränkung mit NORELY für SpalteBhat, verweist dasIMMUTABLE WHERE-Prädikat möglicherweise nur auf SpalteA(oder eine Teilmenge der RELY-Einschränkungsspalten).Wenn die Tabelle eine Primärschüsseleinschränkung mit RELY für Spalte
Aund eine eindeutige Einschränkung mit RELY für SpalteBsowie eine eindeutige Einschränkung mit NORELY für SpalteC, verweist das PrädikatIMMUTABLE WHEREmöglichweise nur auf SpalteAundBoder auf eine Teilmenge dieser Spalten.
Die Gültigkeitsdauer wird geprüft, wenn eine RELY-Einschränkung oder das IMMUTABLE WHERE-Prädikat hinzugefügt oder geändert wird. Wenn der resultierende Status gegen die Regel verstoßen würde (z. B. verweist das Prädikat auf eine Spalte, die in keinem RELY-Einschränkung enthalten ist) schlägt die Anweisung mit einem Fehler fehl.
Nächste Schritte¶
Implementierungsanleitungen und Beispiele finden Sie unter Beispiele für Backfilling und Unveränderlichkeitseinschränkungen.