Erläuterungen zu Primärschlüsseln in dynamischen Tabellen¶
Snowflake kann Primärschlüssel in dynamischen Tabellen und dynamischen Iceberg-Tabellen verwenden, um Änderungen auf Zeilenebene effizienter zu verfolgen und um eine inkrementelle Aktualisierung nachgelagert von dynamischen Tabellen mit vollständiger Aktualisierung zu ermöglichen. Anstatt sich auf Spalten zur Änderungsverfolgung zu verlassen, verwendet Snowflake Primärschlüssel als stabile Zeilenbezeichner, um die minimale Menge von Änderungen zwischen den Aktualisierungen zu berechnen.
Dies ist besonders in den folgenden Szenarien nützlich:
Basistabellen werden regelmäßig mithilfe von INSERT OVERWRITE neu geschrieben und nicht an Ort und Stelle aktualisiert, was normalerweise verhindert, dass Snowflake erkennt, was sich zwischen den Versionen geändert hat.
Die Pipeline liest aus einer extern verwalteten Apache Iceberg™ v2-Tabelle, die vor der Zeilenherkunft steht.
Einige dynamische Tabellen müssen den vollständigen Aktualisierungsmodus verwenden, da inkrementelle Konstrukte nicht unterstützt werden, aber nachgelagerte Tabellen würden von einer inkrementellen Verarbeitung profitieren.
Typen von Primärschlüsseln in dynamischen Tabellen¶
Snowflake unterstützt zwei Arten von Anwendungsfällen für Primärschlüssel für dynamische Tabellen: 1) Änderungsverfolgung auf Zeilenebene und 2) Ableitung eines eindeutigen Schlüssels für die dynamische Tabelle selbst.
Abstammungsbasierte Änderungsverfolgung auf der Zeilenebene von Primärschlüsseln¶
Wenn eine Basistabelle eine Primärschlüsseleinschränkung mit der festgelegten RELY-Eigenschaft hat, verwendet Snowflake diesen Schlüssel für die Änderungsverfolgung auf Zeilenebene in nachgelagerten dynamischen Tabellen. Dies ist besonders nützlich, wenn die Basistabelle regelmäßig mithilfe von INSERT OVERWRITE umgeschrieben wird, was normalerweise die Änderungsverfolgung über Tabellenversionen hinweg verhindert.
Mit einem zuverlässigen Primärschlüssel identifiziert Snowflake, welche Zeilen zwischen den Aktualisierungen geändert wurden, indem die Werte des Primärschlüssels verglichen werden, anstatt sich auf interne Spalten zur Änderungsverfolgung zu verlassen. Dies ermöglicht eine inkrementelle Verarbeitung, auch wenn die zugrunde liegenden Daten vollständig ersetzt werden.
So stellen Sie die RELY-Eigenschaft für einen Primärschlüssel in einer Basistabelle ein:
Ableitung des eindeutigen Schlüssels¶
Snowflake kann automatisch einen zuverlässigen eindeutigen Schlüssel aus der Abfragedefinition einer dynamischen Tabelle ableiten. Zum Beispiel erzeugen die folgenden SQL-Konstrukte abgeleitete eindeutige Schlüssel:
GROUP BY: Die Gruppierungsspalten bilden einen eindeutigen Schlüssel, da jede Gruppe genau eine Ausgabezeile erzeugt.
QUALIFY ROW_NUMBER() = 1: Die partitionierten Spalten bilden einen eindeutigen Schlüssel, da der Filter genau eine Zeile pro Partition beibehält.
Zuverlässige Primärschlüssel für Basistabellen: Der Primärschlüssel der Basistabelle wird als eindeutiger Schlüssel der dynamischen Tabelle verwendet.
Snowflake registriert abgeleitete Primärschlüssel als eindeutige Einschränkungen für die dynamische Tabelle. Da diese Einschränkungen aus der Abfragestruktur stammen, sind sie ohne zusätzliche Validierung vollständig zuverlässig.
Um zu prüfen, ob eine dynamische Tabelle über einen abgeleiteten Primärschlüssel verfügt, führen Sie Folgendes aus:
Wann Primärschlüssel verwendet werden sollten¶
Primärschlüssel sind in den folgenden Szenarien nützlich:
- Änderungsverfolgung für INSERT OVERWRITE-Workloads verbessern
Wenn eine Basistabelle regelmäßig mithilfe von INSERT OVERWRITE umgeschrieben wird, kann Snowflake keine Standardspalten zur Änderungsverfolgung verwenden, um zu erkennen, was sich geändert hat. Mithilfe eines Primärschlüssels kann Snowflake Zeilen anhand des Schlüsselwerts vergleichen und nur die tatsächlichen Änderungen verarbeiten, sodass eine vollständige Neuberechnung der dynamischen Tabelle vermieden wird.
- Inkrementelle Aktualisierung nachgelagert von dynamischen Tabellen mit vollständiger Aktualisierung aktivieren
Normalerweise kann eine dynamische Tabelle im inkrementellen Aktualisierungsmodus nicht nachgelagert einer dynamischen Tabelle im vollständigen Aktualisierungsmodus sein. Wenn die vorgelagerte dynamische Tabelle mit vollständiger Aktualisierung einen vom System abgeleiteten eindeutigen Schlüssel hat, kann Snowflake die Änderungen zwischen den vollständigen Aktualisierungen berechnen, sodass nachgelagerte Tabellen inkrementell aktualisiert werden können. Damit wird ein großer Blockierer für inkrementelle Pipelines entfernt.
- Weitergabe von Änderungen in Pipelines verringern
Primärschlüssel ermöglichen eine wertbasierte Änderungsreduzierung in jeder Phase einer Pipeline. Snowflake kann Zeilen herausfiltern, in denen der Primärschlüssel sowohl in der alten als auch in der neuen Version mit identischen Werten existiert, wodurch das Volumen der Änderungen reduziert wird, die in nachgelagerte Tabellen übertragen werden.
Wichtige Verhaltensweisen¶
Option für die nachgelagerte inkrementelle Aktualisierung: Um die inkrementelle Aktualisierung für eine dynamische Tabelle zu verwenden, die aus einer dynamischen Tabelle mit vollständiger Aktualisierung mit einem abgeleiteten eindeutigen Schlüssel liest, müssen Sie explizit
REFRESH_MODE = INCREMENTALfür die nachgelagerte Tabelle festlegen. Mithilfe der Einstellung vonREFRESH_MODE = AUTOwird weiterhin in FULL aufgelöst.Die Unterstützung der Primärschlüssel-basierten Änderungsverfolgung überprüfen: Verwenden Sie
SHOW UNIQUE KEYS IN <dt_name>, um zu überprüfen, ob eine dynamische Tabelle über einen abgeleiteten eindeutigen Schlüssel verfügt. Alternativ können Sie mitREFRESH_MODE = INCREMENTALeine nachgelagerte dynamische Tabelle erstellen und überprüfen, ob die Erstellung erfolgreich war.Maskierungsrichtlinien: Maskierungsrichtlinien, die Primärschlüsselspalten verschleiern, verhindern, dass Snowflake diese Schlüssel für die Änderungsverfolgung verwendet. In diesem Fall greift Snowflake auf die Standardspalten zur Änderungsverfolgung zurück.
Nächste Schritte¶
Beispiele und Implementierungsanleitungen finden Sie unter Verwenden von Primärschlüsseln zum Optimieren dynamischer Tabellen-Pipelines.
Die vollständige Syntax von CREATE DYNAMIC TABLE finden Sie unter CREATE DYNAMIC TABLE.