Dynamische Tabellen im Vergleich zu Streams und Aufgaben und zu materialisierten Ansichten

Wie Streams und Aufgaben bieten auch dynamische Tabellen eine Möglichkeit, Daten in Ihrer Pipeline zu transformieren:

Dynamische Tabellen im Vergleich zu Streams und Aufgaben

Obwohl dynamische Tabellen einen ähnlichen Zweck wie Streams und Aufgaben erfüllen, gibt es wichtige Unterschiede:

Streams auf einer dynamischen Tabelle erstellen

Streams auf dynamischen Tabellen können genauso erstellt werden wie Streams auf herkömmlichen Tabellen, allerdings mit folgenden Einschränkungen:

  • Aktualisierungsmodus: Streams können nur für dynamische Tabellen erstellt werden, die inkrementell aktualisiert werden. Dynamische Tabellen mit vollständiger Aktualisierung werden nicht unterstützt, da sie die Tabelle bei jeder Aktualisierung komplett neu schreiben.

  • Streamtyp: Dynamische Tabellen unterstützen nur Standard-Streams (d. h. Delta-Streams). Weitere Informationen dazu finden Sie unter Typen von Streams.

Das folgende Beispiel zeigt, wie Sie einen Stream für eine dynamische Tabelle erstellen:

-- Create the dynamic table, for reference only
CREATE OR REPLACE DYNAMIC TABLE product ...;

-- Create the stream.
CREATE OR REPLACE STREAM deltaStream ON DYNAMIC TABLE product;
Copy

Vergleich zwischen Streams/Aufgaben und dynamischen Tabellen

Streams und Aufgaben

Dynamische Tabellen

Aufgaben verwenden einen imperativen Ansatz: Sie schreiben prozeduralen Code, um Daten aus Basistabellen zu transformieren.

Dynamische Tabellen verwenden einen deklarativen Ansatz: Sie schreiben eine Abfrage, in der Sie das gewünschte Ergebnis angeben, und die Daten werden aus den in der Abfrage verwendeten Basistabellen abgerufen und umgewandelt. Mit Ausnahme von Unterstützte nicht deterministische Funktionen in vollständiger Aktualisierung kann die Abfrage keine nicht-deterministischen Funktionen enthalten.

Sie definieren einen Zeitplan für die Ausführung des Codes, der die Daten transformiert.

Ein automatischer Aktualisierungsprozess bestimmt den Zeitplan für die Ausführung der Aktualisierungen. Der Prozess erstellt den Zeitplan für diese Aktualisierungen, sodass der angestrebte Grad an Aktualität (Verzögerung) erreicht wird.

Der prozedurale Code kann Aufrufe zu nicht deterministischem Code, gespeicherten Prozeduren und anderen Aufgaben enthalten. Der prozedurale Code kann Aufrufe von UDFs und externe Funktionen enthalten.

Obwohl die SELECT-Anweisung für eine dynamische Tabelle Verknüpfungen, Aggregationen, Fensterfunktionen und andere SQL-Funktionen und -Konstruktionen enthalten kann, kann die Anweisung keine Aufrufe von gespeicherten Prozeduren und Aufgaben enthalten. Derzeit kann die SELECT-Anweisung auch keine Aufrufe von externen Funktionen enthalten.

Diese Einschränkung ist auf die Art und Weise zurückzuführen, in der dynamische Tabellen aktualisiert werden. Um die Daten zu aktualisieren, analysiert ein automatisierter Prozess die SELECT-Anweisung für die dynamische Tabelle, um den besten Ansatz zur Aktualisierung der Daten zu bestimmen. Der automatisierte Prozess kann dies für bestimmte Typen von Abfragen nicht ermitteln.

Die vollständige Liste der Einschränkungen für die SELECT-Anweisung finden Sie unter Unterstützte Abfragen bei der inkrementellen Aktualisierung und Allgemeine Einschränkungen.

Aufgaben können Streams verwenden, um Daten in Zieltabellen inkrementell zu aktualisieren. Sie können diese Aufgaben so planen, dass sie in regelmäßigen Abständen ausgeführt werden.

Ein automatischer Aktualisierungsprozess führt regelmäßig inkrementelle Aktualisierungen der dynamischen Tabellen durch. Der Prozess bestimmt den Zeitplan auf Basis einer von Ihnen festgelegten Aktualität der Daten.

Beispiel: Vergleich der Datentransformation zwischen Streams/Aufgaben und dynamischen Tabellen

Das Beispiel in Transformieren geladener JSON-Daten nach einem Zeitplan verwendet Streams und Aufgaben, um neue Daten umzuwandeln und in eine Zieltabelle (names) einzufügen, während die Daten in eine Zieltabelle (raw) gestreamt werden.

Das folgende Beispiel zeigt, wie Sie dieselbe Transformation mit dynamischen Tabellen ausführen können. Wie dieses Beispiel zeigt, geben Sie beim Erstellen einer dynamischen Tabelle die Abfrage für die Ergebnisse an, die Sie sehen möchten. Für die inkrementelle Aktualisierung der Daten müssen Sie keinen Stream erstellen, um Änderungen verfolgen und eine Aufgabe schreiben zu können, die diese Änderungen untersucht und auf die Zieltabelle anwendet. Der automatische Aktualisierungsprozess erledigt dies für Sie, basierend auf der von Ihnen angegebenen Abfrage.

SQL-Anweisungen für Streams und Aufgaben

SQL-Anweisungen für dynamische Tabellen

-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a stream to capture inserts
-- to the landing table.
CREATE OR REPLACE STREAM rawstream1
  ON TABLE raw;

-- Create a table that stores the
-- names of office visitors from the
-- raw data.
CREATE OR REPLACE TABLE names
  (id INT,
   first_name STRING,
   last_name STRING);

-- Create a task that inserts new name
-- records from the rawstream1 stream
-- into the names table.
-- Execute the task every minute when
-- the stream contains records.
CREATE OR REPLACE TASK raw_to_names
  WAREHOUSE = mywh
  SCHEDULE = '1 minute'
  WHEN
    SYSTEM$STREAM_HAS_DATA('rawstream1')
  AS
    MERGE INTO names n
      USING (
        SELECT var:id id, var:fname fname,
        var:lname lname FROM rawstream1
      ) r1 ON n.id = TO_NUMBER(r1.id)
      WHEN MATCHED AND metadata$action = 'DELETE' THEN
        DELETE
      WHEN MATCHED AND metadata$action = 'INSERT' THEN
        UPDATE SET n.first_name = r1.fname, n.last_name = r1.lname
      WHEN NOT MATCHED AND metadata$action = 'INSERT' THEN
        INSERT (id, first_name, last_name)
          VALUES (r1.id, r1.fname, r1.lname);
Copy
-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a dynamic table containing the
-- names of office visitors from
-- the raw data.
-- Try to keep the data up to date within
-- 1 minute of real time.
CREATE OR REPLACE DYNAMIC TABLE names
  TARGET_LAG = '1 minute'
  WAREHOUSE = mywh
  AS
    SELECT var:id::int id, var:fname::string first_name,
    var:lname::string last_name FROM raw;
Copy

Dynamische Tabellen im Vergleich zu materialisierten Ansichten

Dynamische Tabellen haben einige Ähnlichkeiten mit materialisierten Ansichten, da beide die Ergebnisse einer Abfrage materialisieren. Es gibt jedoch wichtige Unterschiede:

Materialisierte Ansichten

Dynamische Tabellen

Materialisierte Ansichten dienen dazu, die Abfrageleistung transparent zu verbessern.

Wenn Sie z. B. die Basistabelle abfragen, kann die Abfrageoptimierung in Snowflake die Abfrage automatisch umschreiben, um stattdessen die materialisierte Ansicht abzufragen.

Dynamische Tabellen sind für den Aufbau mehrstufiger Datenpipelines konzipiert.

Obwohl dynamische Tabellen die Abfrageleistung verbessern können, schreibt die Abfrageoptimierung in Snowflake nicht automatisch Abfragen um, um dynamische Tabellen zu verwenden. Eine dynamische Tabelle wird nur dann in einer Abfrage verwendet, wenn Sie die dynamische Tabelle in der Abfrage angeben.

Eine materialisierte Ansicht kann nur eine einzige Basistabelle verwenden. Eine materialisierte Ansicht kann nicht auf einer komplexen Abfrage basieren (d. h. einer Abfrage mit Joins oder verschachtelten Ansichten).

Eine dynamische Tabelle kann auf einer komplexen Abfrage basieren, die auch Joins und Unions enthalten kann.

Daten, auf die über materialisierte Ansichten zugegriffen wird, sind immer aktuell. Wenn die Daten in der Basistabelle durch eine DML-Operation geändert wurden, aktualisiert Snowflake entweder die materialisierte Ansicht oder verwendet die aktualisierten Daten aus der Basistabelle.

Die Daten sind bis zur Zielverzögerungszeit für die dynamische Tabelle aktuell.

Die Wartung und Aktualisierung dynamischer Tabellen wird automatisch von einem separaten Computedienst verwaltet, einschließlich der Aktualisierungslogik, zusammen mit der Verarbeitung aller Aktualisierungen, was in der Regel mit zusätzlichen Kosten verbunden ist. Weitere Informationen dazu finden Sie unter Erläuterungen zu den Kosten von dynamischen Tabellen.