Einfluss des Aktualisierungsmodus auf die Performance dynamischer Tabellen¶
Der tatsächliche Aktualisierungsmodus einer dynamischen Tabelle wird zum Zeitpunkt der Erstellung festgelegt und ist danach unveränderlich. Wenn nicht explizit angegeben, ist der Aktualisierungsmodus standardmäßig auf AUTO
eingestellt, wodurch der Aktualisierungsmodus auf der Grundlage verschiedener Faktoren wie der Abfragekomplexität oder nicht unterstützter Konstrukte, Operatoren oder Funktionen ausgewählt wird.
Informationen zum Verifizieren des Aktualisierungsmodus für Ihre dynamischen Tabellen finden Sie unter Aktualisierungsmodus von dynamischen Tabellen anzeigen.
Tipp
Um den besten Modus für Ihren Anwendungsfall zu ermitteln, experimentieren Sie mit automatischen Empfehlungen und den konkreten Aktualisierungsmodi (vollständig und inkrementell). Der beste Modus für die Leistung Ihrer dynamischen Tabellen hängt vom Volumen der Datenänderungen und der Komplexität der Abfrage ab. Außerdem hilft das Testen verschiedener Aktualisierungsmodi mit einem speziellen Warehouse dabei, die Kosten zu isolieren und die Leistung auf der Grundlage des tatsächlichen Workloads zu verbessern.
Um eine konsistente Verhaltensweise in allen Snowflake Releases zu gewährleisten, stellen Sie den Aktualisierungsmodus explizit für alle Produktionstabellen ein. Die Verhaltensweise von AUTO
kann sich zwischen verschiedenen Releases von Snowflake ändern, was bei der Verwendung in Produktionspipelines zu unerwarteten Änderungen der Leistung führen kann.
Weitere Informationen dazu finden Sie unter Best Practices zum Optimieren der Leistung.
Leistung im Modus der vollständigen Aktualisierung¶
Bei einer vollständigen Aktualisierung wird die Abfrage ausgeführt und die dynamischen Tabellen werden mit den Ergebnissen überschrieben. Der Inhalt einer dynamischen Tabelle ist derselbe, unabhängig davon, ob der Modus der vollständigen oder inkrementellen Aktualisierung gewählt wurde.
Die vollständige Aktualisierung wird normalerweise für komplexe Abfragen oder Workload verwendet, bei denen eine inkrementelle Aktualisierung weniger effizient ist.
Obwohl die vollständige Aktualisierung ressourcenintensiv ist, ist sie nützlich, wenn eine erneute Verarbeitung des gesamten Datensets erforderlich ist, z. B. bei nicht unterstützten inkrementellen Operationen oder erheblichen Datenänderungen.
Um die Leistung der vollständigen Aktualisierung zu optimieren, behandeln Sie sie wie jede andere Snowflake-Abfrage, aber denken Sie daran, dass die Kosten sowohl die Ausführung der Abfrage als auch das Einfügen der Ergebnisse umfassen, nicht nur die Ausführung der Abfrage.
Leistung im Modus der inkrementellen Aktualisierung¶
Eine inkrementelle Aktualisierung konzentriert sich auf die Anwendung von Änderungen seit der letzten Aktualisierung und ist daher effizienter für große Datensets mit kleinen Aktualisierungen. Der Inhalt einer dynamischen Tabelle ist unabhängig vom gewählten Aktualisierungsmodus gleich.
Eine inkrementelle Aktualisierung kann jedoch ressourceneffizienter sein, da sie die erneute Verarbeitung unveränderter Daten überspringt. Die Entscheidung für eine inkrementelle Aktualisierung hängt von den Merkmalen Ihres Workloads ab, z. B. dem Umfang und der Komplexität der Änderungen und den potenziellen Leistungssteigerungen in Bezug auf Geschwindigkeit und Ressourceneinsparungen.
In den folgenden Abschnitten wird erläutert, wann sich ein Workload für eine inkrementelle Aktualisierung eignet. Wenn Ihr Workload nicht den in diesen Abschnitten beschriebenen Bedingungen entspricht, sollten Sie den Modus der vollständigen Aktualisierung verwenden, um eine bessere Effizienz zu erzielen.
Erläuterungen zur Leistung der inkrementellen Aktualisierung
Einfluss des Änderungsumfangs auf die Leistung der inkrementellen Aktualisierung
Einfluss der Lokalität auf die Leistung der inkrementellen Aktualisierung
Optimieren der Leistung inkrementeller Aktualisierungen bei komplexen dynamischen Tabellen
Informationen zur Leistungsoptimierung der inkrementellen Aktualisierung finden Sie unter Leistung der inkrementellen Aktualisierung.
Bemerkung
Die Empfehlungen in dieser Dokumentation können sich mit verbesserter Unterstützung für Abfragen und Leistung von inkrementellen Aktualisierungen im Laufe der Zeit ändern.
Erläuterungen zur Leistung der inkrementellen Aktualisierung¶
Bei einer inkrementellen Aktualisierung entfällt der meiste Aufwand auf die Berechnung von Änderungen in der dynamischen Tabelle. Dies hängt von der Abfrage ab und kann recht komplex sein. Ein häufiges Missverständnis ist, dass eine inkrementelle Aktualisierung nur die Änderungen in den Quelltabellen durchsucht, nicht die Quelltabellen selbst. Dies kann zu dem Missverständnis führen, dass eine inkrementelle Aktualisierung nur Aufwand im Verhältnis zur Menge der geänderten Quelldaten entstehen sollte, was nicht der Fall ist. In der Realität muss bei inkrementellen Aktualisierungen oft direkt die Quelltabellen gescannt werden.
Stellen Sie sich zum Beispiel eine Abfrage vor, die eine innere Verknüpfung zwischen den Tabellen A und B vornimmt. Wenn eine Zeile in Tabelle A eingefügt wird, muss sie mit Tabelle B verknüpft werden, um Änderungen in der Abfrage zu berechnen. Diese einzelne Zeile in A kann mit vielen Zeilen in B verknüpft werden, was eine Menge Arbeit bedeuten kann, auch wenn es nur wenige Änderungen in den Quellen gibt.
Dieser Mehraufwand kann bei verschiedenen Operatoren anfallen. Die inkrementelle Aktualisierung verarbeitet neue Daten und überspringt die Arbeit, die bereits erledigt wurde. Die Entscheidung, was übersprungen werden soll, kann zusätzlichen Aufwand erfordern, insbesondere bei komplexen Abfragen, und verschiedene Operatoren können Arbeit auf unterschiedliche Weise überspringen.
Normalerweise beeinflussen der Umfang der Änderungen und die Lokalität, wie viel Workload übersprungen werden kann.
Einfluss des Änderungsumfangs auf die Leistung der inkrementellen Aktualisierung¶
Der wichtigste Faktor, der die Leistung der inkrementellen Aktualisierung beeinflusst, ist der Umfang der Änderungen in den Quelldaten. Wenn Sie den Umfang der Änderungen für die Aktualisierung Ihrer dynamischen Tabellen bestimmen, stellen Sie sicher, dass Sie die kopierten Zeilen mitzählen. Eine DML, die einige Zeilen in einer Mikropartition ändert, kopiert auch die unveränderten Zeilen aus dieser Mikropartition in eine neue Mikropartition.
Um die Anzahl der geänderten Zeilen in einer Basistabelle zu analysieren, erstellt einen Stream auf der Basistabelle zum Zeitpunkt der letzten Aktualisierung und verwendet SYSTEM$STREAM_BACKLOG. Beispiel:
CREATE STREAM mystream ON TABLE mybasetable BEFORE(STATEMENT => 'last refresh UUID');
SELECT * FROM SYSTEM$STREAM_BACKLOG('mystream');
Betrachten Sie als extremes Beispiel die Auswirkung des Löschens aller Daten aus einer Quelle: eine vollständige Aktualisierung sieht nur eine leere Tabelle, die sehr schnell verarbeitet werden kann. Im Gegensatz dazu muss bei einer inkrementellen Aktualisierung jede gelöschte Zeile verarbeitet werden, wodurch dieser Modus viel langsamer ist.
Ähnliche Verlangsamungen können auch in weniger extremen Fällen auftreten. Eine gute Richtwert für einen günstigen Workload ist es, wenn Änderungen im Ursprung oder Ziel auf weniger als 5 % der Zeilen begrenzt sind.
Einfluss der Lokalität auf die Leistung der inkrementellen Aktualisierung¶
Der zweitwichtigste Faktor, der sich auf die inkrementelle Aktualisierung auswirkt, ist die Lokalität, die sich darauf bezieht, wie eng Daten oder Aktionen entlang verschiedener Dimensionen miteinander verbunden sind.
Wenn Sie beispielsweise eine Tabelle mit einer Zeitstempelspalte haben und immer Zeilen mit der aktuellen Zeit in dieser Spalte einfügen, dann besteht bei Ihrem Workload eine starke Lokalität zwischen der Einfügereihenfolge und der Zeitstempelspalte.
Lokalität kann sich in verschiedenen Formen zeigen, aber einige sind besonders wichtig für die inkrementelle Aktualisierung. Die Verbesserung der Lokalität in einem der folgenden Bereiche steigert die Leistung von inkrementellen Aktualisierungen, obwohl es nicht immer möglich ist, in allen drei Kategorien eine starke Lokalität zu haben.
Lokalitätsbereich |
Beschreibung |
---|---|
Lokalität zwischen Gruppierungs- und Partitionierungsschlüsseln |
Wenn Sie eine Partitionierungsoperation in der Definition der dynamischen Tabelle durchführen, ist es von Vorteil, wenn die zugrunde liegenden Quellen auf Basis dieser Partitionierungsschlüssel geclustert sind. Wenn Sie z. B. zwei Tabellen über eine ID verknüpfen, ist es für die Leisutng der inkrementelle Aktualisierung besser, wenn die Tabellen nach ihren jeweiligen ID-Spalten geclustert sind. |
Lokalität zwischen Partitionierungs- oder Gruppierungsschlüsseln und Quellenänderungen |
Idealerweise sollte bei Änderungen an Quellen nur ein kleiner Teil der Zeilen in den Quelltabellen einen Partitionierungsschlüssel gemeinsam haben. Wenn Sie z. B. Zeilen mit aktuellem Zeitstempel einfügen, funktioniert die Gruppierung nach Stunden aufgrund der starken Lokalität zwischen den Schlüsseln und den Quellenänderungen gut. Wenn Sie jedoch Zeilen mit einem Spaltenwert einfügen, der in vielen anderen Zeilen der Tabelle vorkommt, führt das Gruppieren nach dieser Spalte zu einer schlechten Leistung beim inkrementellen Aktualisieren. |
Lokalität zwischen Zieltabellenänderungen und Clustering |
Wenn eine inkrementelle Aktualisierung Änderungen an einer dynamischen Tabelle vornimmt, werden Updates und Löschungen auf dem aktuellen Status der dynamischen Tabelle verknüpft. Diese Verknüpfung funktioniert besser, wenn die Änderungen zum Clustering der dynamischen Tabelle passen. Wenn die Aktualisierungen beispielsweise nur kürzlich eingefügte Zeilen aktualisieren, passen sie gut zum Clustering der Tabelle. Informationen darüber, wie Snowflake-Tabellen gespeichert werden, finden Sie unter Grundlegendes zu Tabellenstrukturen in Snowflake. Um Clustering für eine Tabelle zu verwalten, verwenden Sie Automatic Clustering. |
Leistungserwartungen bei inkrementellen Aktualisierungen einzelner Operatoren¶
Die folgende Tabelle zeigt die ungefähre Leistungserwartung für inkrementelle Aktualisierungen der einzelnen Operatoren. Die Leistung wird im Vergleich zu einer vollständigen Aktualisierung gemessen, wobei davon ausgegangen wird, dass sich nur 5 % der Zeilen geändert haben und die Aktualisierungsjobs mindestens 1 Minute dauern.
Bemerkung
Aufgrund des festen Overheads (z. B. Abfrageoptimierung, Warehouse-Planung und Jobbereinigung), der sich durch die Abfrageoptimierung nicht beschleunigt, können kurze Abfragen (weniger als 10 Sekunden) geringere Leistungssteigerungen aufweisen.
Operator |
Leistungssteigerung |
---|---|
SELECT |
10 × |
WHERE |
10 × |
FROM |
10 × |
UNION ALL |
10 × |
Skalare Aggregate |
10 × |
Für Operatoren, die von Lokalität betroffen sind, zeigt die Tabelle die Leistungserwartungen bei guter und schlechter Lokalität. Beachten Sie, dass bei einigen Operatoren eine schlechte Lokalität zu einer schlechteren Leistung führen kann als eine vollständige Aktualisierungen.
Operator |
Lokalität |
Leistungssteigerung |
---|---|---|
GROUP BY |
Gut |
5 × |
GROUP BY |
Schlecht |
1/3 × |
DISTINCT |
Gut |
5 × |
DISTINCT |
Schlecht |
1/4 × |
OVER |
Gut |
2-5 × |
OVER |
Schlecht |
1/5 × |
INNER JOIN |
Gut |
10 × |
INNER JOIN |
Schlecht |
2 × |
OUTER JOIN |
Gut |
3 × |
OUTER JOIN |
Schlecht |
0,1 × |
Weitere Informationen dazu finden Sie unter Inkrementelle Aktualisierungen durch Operatoren.
Optimieren der Leistung inkrementeller Aktualisierungen bei komplexen dynamischen Tabellen¶
Dynamische Tabellen enthalten in der Regel mehrere Operatoren, sodass es schwieriger ist, ihre Leistung bei inkrementellen Aktualisierungen vorherzusagen. In diesem Abschnitt erfahren Sie, wie Sie mit dieser Herausforderung umgehen können, und erhalten einige Tipps zur Verbesserung der Leistung bei komplexen dynamischen Tabellen.
Wenn mehrere Operatoren beteiligt sind, berechnen inkrementelle Aktualisierungen Änderungen, indem sie jeden Operator separat bearbeiten und ihn in ein Fragment eines Abfrageplans verwandeln, der Änderungen auf der Grundlage seiner Eingaben berechnen kann. Für jede Eingabe kann dieses neue Fragment die Eingabe vor den Änderungen, nach den Änderungen oder nur die Änderungen selbst anfordern. Wenn Sie diesen Prozess auf jeden Operator in der ursprünglichen Abfrage anwenden, erhalten Sie einen neuen Abfrageplan, der die Änderungen mit einer Mischung aus Änderungs-Scans und vollständigen Tabellen-Scans berechnet. Dieser Plan wird von der Snowflake-Abfrageoptimierung optimiert und wie jede andere Abfrage ausgeführt.
Wenn eine inkrementelle Aktualisierung nicht gut funktioniert, liegt das in der Regel daran, dass es zu viele Änderungen gibt oder die Lokalität schlecht ist. Komplexe Abfragen machen es schwieriger, diese Probleme zu erkennen. Die Leistung von inkrementellen Operatoren hängt in der Regel von der Menge der Änderungen und der Lokalität ihrer Eingaben ab. Diese Eingaben sind jedoch die Ausgaben anderer Operatoren, sodass sich die Menge und Lokalität der Daten beim Durchlaufen der Operatoren ändern können.
Um die Leistung einer komplexen inkrementellen Aktualisierung zu verstehen, muss die Eingaben jedes Operators separat betrachtet werden. Im Folgenden finden Sie einige gängige Szenarios und Vorschläge, wie Sie das Problem angehen können:
Szenario |
Empfehlung |
---|---|
Verknüpfen von Tabellen über mehrere Spalten, CLUSTER BY kann nicht für alle gleichzeitig verwendet werden |
Priorisieren Sie das Clustering größerer Tabellen bei Schlüsseln, die häufig wechseln. In einem Sternschema mit einer großen Dimensionstabelle sollten Sie sich beispielsweise auf das Clustering der Dimensionstabelle konzentrieren. Ziehen Sie in Erwägung, mehrere Kopien desselben Datensets zu erstellen, die jeweils nach unterschiedlichen Clustering-Schlüsseln geordnet sind, und verwenden Sie diese dann in entsprechenden Kontexten. |
GROUP BY oder OVER mit vielen Verknüpfungen |
Stellen Sie sicher, dass die Quelltabellen durch Gruppierungs-/Partitionierungsschlüssel geclustert sind, und erwägen Sie die Aufteilung von Joins und Aggregationen auf zwei separate dynamische Tabellen. Beachten Sie, dass äußere Joins schlecht mit Aggregationen interagieren. |