Dynamische Tabellen erstellen

Unter diesem Thema werden die wichtigsten Konzepte zur Erstellung dynamischer Tabellen erläutert.

Stellen Sie vor Beginn sicher, dass Sie über die Berechtigungen für das Erstellen dynamischer Tabellen verfügen und dass für alle von der Abfrage dynamischer Tabellen verwendeten Objekte die Änderungsverfolgung aktiviert ist.

Für das Erstellen dynamischer Tabellen können einige Einschränkungen gelten. Eine vollständige Liste finden Sie unter Beschränkungen für dynamische Tabellen.

Änderungsverfolgung aktivieren

Wenn beim Erstellen einer dynamischen Tabelle mit inkrementellem Aktualisierungsmodus die Änderungsverfolgung für die abgefragten Tabellen noch nicht aktiviert ist, versucht Snowflake automatisch, die Änderungsverfolgung für sie zu aktivieren. Um inkrementelle Aktualisierungen zu unterstützen, muss die Änderungsverfolgung mit Nicht-Null-Time Travel-Aufbewahrungsfrist für alle zugrunde liegenden Objekte, die von einer dynamischen Tabelle verwendet werden, aktiviert sein.

Wenn sich die Basisobjekte ändern, ändert sich auch die dynamische Tabelle. Wenn Sie ein Basisobjekt neu erstellen, müssen Sie die Änderungsverfolgung wieder aktivieren.

Bemerkung

Snowflake versucht nicht automatisch, die Änderungsverfolgung bei dynamischen Tabellen zu aktivieren, die im Modus der vollständigen Aktualisierung erstellt wurden.

Um die Änderungsverfolgung für ein bestimmtes Datenbankobjekt zu aktivieren, verwenden Sie ALTER TABLE, ALTER VIEW und ähnliche Befehle für dieses Objekt. Der Benutzer, der die dynamische Tabelle erstellt, muss die OWNERSHIP-Berechtigungen haben, um die Änderungsverfolgung für alle zugrunde liegenden Objekte zu aktivieren.

Um zu prüfen, ob die Änderungsverfolgung aktiviert ist, verwenden Sie SHOW VIEWS, SHOW TABLES und ähnliche Befehle für die zugrunde liegenden Objekte, und untersuchen Sie die Spalte change_tracking.

Unterstützte Basisobjekte

Dynamische Tabellen unterstützen die folgenden Basisobjekte:

  • Tabellen

  • Von Snowflake verwaltete Apache Iceberg™-Tabellen

  • Extern verwaltete Apache Iceberg™-Tabellen

Beispiel: Erstellen einer einfachen dynamischen Tabelle

Angenommen, Sie möchten eine dynamische Tabelle erstellen, die die Spalten product_id und product_name aus der Tabelle staging_table enthält, und Sie haben folgende Ziele:

  • Sie möchten, dass die Daten in der dynamischen Tabelle höchstens 20 Minuten hinter den Daten in staging_table zurückbleiben.

  • Sie möchten die Computeressourcen des Warehouses mywh für die Aktualisierung verwenden.

  • Sie möchten, dass der Aktualisierungsmodus automatisch ausgewählt wird.

  • Sie möchten, dass die dynamische Tabelle bei der Erstellung synchron aktualisiert wird.

  • Sie möchten, dass der Aktualisierungstyp automatisch ausgewählt wird und dass die dynamische Tabelle bei der Erstellung synchron aktualisiert wird.

Zum Erstellen der dynamischen Tabelle führen Sie die folgende SQL-Anweisung CREATE DYNAMIC TABLE aus:

CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table
  TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  REFRESH_MODE = auto
  INITIALIZE = on_create
  AS
    SELECT product_id, product_name FROM staging_table;
Copy

Eine vollständige Liste der Parameter und der Syntaxvarianten finden Sie unter CREATE DYNAMIC TABLE.

Erstellen dynamischer Tabellen, die aus von Snowflake verwalteten oder extern verwalteten Apache Iceberg™-Tabellen lesen

Das Erstellen einer dynamischen Tabelle aus einer Iceberg-Tabelle ist ähnlich wie das Erstellen einer dynamischen Tabelle aus einer regulären Tabelle. Führen Sie die CREATE DYNAMIC TABLE SQL-Anweisung wie bei einer normalen Tabelle aus, wobei entweder eine von Snowflake verwaltete Tabelle oder eine von einem externen Katalog verwaltete Tabelle als Basisobjekt verwendet wird.

Dynamische Tabellen, die aus einer von Snowflake verwalteten Iceberg-Tabelle als Basistabelle lesen, sind nützlich, wenn Sie möchten, dass Ihre Pipelines Daten in einer Snowflake-verwalteten Iceberg-Tabelle verarbeiten oder wenn Sie möchten, dass Ihre Pipelines Iceberg-Tabellen verarbeiteten, die von anderen Engines geschrieben wurden. Beachten Sie, dass externe Engines nicht in von Snowflake verwaltete Iceberg-Tabellen schreiben können. Sie haben Lese- und Schreibberechtigungen für Snowflake, sind für externe Engines jedoch schreibgeschützt.

Dynamische Tabellen, die aus Iceberg-Tabellen lesen, die von externen (nicht Snowflake) Katalogen, z. B. AWS Glue, verwaltet werden und von Engines wie Apache Spark geschrieben wurden, eignen sich für die Verarbeitung von Daten aus externen Data Lakes. Sie können dynamische Tabellen auf der Grundlage extern verwalteter Daten erstellen und diese kontinuierlich in Snowflake verarbeiten, ohne die Daten zu duplizieren oder aufzunehmen.

Einschränkungen und Hinweise zur Verwendung von Iceberg-Tabellen

Alle Einschränkungen für reguläre dynamische Tabellen und dynamische Iceberg-Tabellen gelten weiterhin.

Außerdem:

  • Alle Einschränkungen für Iceberg-Basistabellen gelten. Weitere Informationen dazu finden Sie unter Hinweise und Einschränkungen.

  • Sie können eine dynamische Tabelle erstellen, die aus nativen Snowflake-Tabellen, aus Snowflake verwalteten Iceberg-Tabellen und aus extern verwalteten Iceberg-Tabellen liest.

  • Dynamische Tabellen verfolgen Änderungen auf Dateiebene für extern verwaltete Iceberg-Basistabellen, im Gegensatz zu anderen Basistabellen, die Änderungen auf Zeilenebene verfolgen. Häufige Kopieren-auf-Schreiben-Operationen (z. B. Aktualisierungen oder Löschungen) auf extern verwalteten Iceberg-Tabellen können sich auf die Leistung von inkrementellen Aktualisierungen auswirken.

Erstellen dynamischer Tabellen mit Unveränderlichkeitseinschränkungen

Unveränderlichkeitseinschränkungen geben Ihnen mehr Kontrolle darüber, wie und wann Ihre dynamischen Tabellen aktualisiert werden. Die Einschränkungen ermöglichen es, dass Teile der Tabelle statisch bleiben, sodass die gesamte Tabelle nicht immer die neuesten Abfrageergebnisse enthält.

Indem Sie bestimmte Teile einer dynamischen Tabelle als unveränderlich markieren, können Sie die folgenden Aufgaben ausführen:

  • Verhindern der Weitergabe von Aktualisierungen oder Löschungen bestehender Daten

  • Einschränken von Einfügungen, Aktualisierungen und Löschungen für Zeilen, die eine Bedingung erfüllen

  • Begrenzen von zukünftigen Änderungen, während gleichzeitig inkrementelle Aktualisierungen anderer Teile der Tabelle möglich sind

Der Rest der Tabelle (d. h. die Zeilen, die nicht der Unveränderlichkeitsbedingung entsprechen) bleibt veränderbar und kann bei einer Aktualisierung aktualisiert werden.

Um Unveränderlichkeitseinschränkungen zu erzwingen, geben Sie den Parameter IMMUTABLE WHERE an, wenn Sie den Befehl CREATE DYNAMIC TABLE oder ALTER DYNAMIC TABLE ausführen. Um festzustellen, ob eine Zeile veränderbar ist oder nicht, verwenden Sie die Spalte METADATA$IS_IMMUTABLE. Beispiel: SELECT * , METADATA$IS_IMMUTABLE FROM my_dynamic_table.

Das IMMUTABLE WHERE -Prädikat wird bei der ersten Aktualisierung ignoriert, gilt aber für alle nachfolgenden Aktualisierungen. Im Modus der vollständigen Aktualisierung wird die Neuberechnung auf die Zeilen beschränkt, die die Bedingung nicht erfüllen. Streams und dynamische Tabellen im inkrementellen Aktualisierungsmodus können aus diesen vollständig aktualisierten Tabellen lesen.

Beispiele für die Verwendung von Unveränderlichkeitseinschränkungen

Im folgenden Beispiel wird eine dynamische Tabelle erstellt und mithilfe des Parameters IMMUTABLE WHERE als unveränderlich festgelegt.

CREATE DYNAMIC TABLE my_dynamic_table (id1 INT)
  TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  IMMUTABLE WHERE ( <expr> )
  AS
    SELECT id AS id1 FROM staging_table;
Copy

Spalten, auf die in der IMMUTABLE WHERE-Bedingung verwiesen wird, müssen Spalten in der dynamischen Tabelle sein, keine Spalten aus der Basistabelle. Beispiel: Der Ausdruck IMMUTABLE WHERE im obigen Beispiel kann nur id1 verwenden, nicht id.

Sie können nur eine einzige IMMUTABLE WHERE-Bedingung für eine dynamische Tabelle festlegen. Um ein vorhandenes Prädikat zu ersetzen, verwenden Sie den Befehl ALTER DYNAMIC TABLE, wie im folgenden Beispiel gezeigt:

-- Set or replace an existing predicate:
ALTER DYNAMIC TABLE my_dynamic_table SET IMMUTABLE WHERE ( <expr> );
Copy
-- Remove an existing predicate:
ALTER DYNAMIC TABLE my_dynamic_table UNSET IMMUTABLE;
Copy

Um die Unveränderlichkeitseinschränkungen für Ihre dynamischen Tabellen anzuzeigen, führen Sie den Befehl SHOW DYNAMIC TABLES aus. Die Spalte immutable_where zeigt die Einschränkung IMMUTABLE WHERE an, die für die Tabelle festgelegt wurde, oder NULL, wenn keine festgelegt ist.

Weitere Informationen zu Computekosten finden Sie unter Computekosten für Unveränderlichkeitseinschränkungen.

Beispiel: Verwenden von IMMUTABLE WHERE, um die Neuberechnung alter Daten zu verhindern, wenn sich eine Dimensionstabelle ändert

Im folgenden Beispiel werden bei der Aktualisierung einer Zeile in der Dimensionstabelle die Fakten des letzten Tages, mit denen sie verknüpft ist, erneut verarbeitet, und nicht alle historischen Fakten:

CREATE DYNAMIC TABLE joined_data
  TARGET_LAG = '1 minute'
  WAREHOUSE = mywh
  IMMUTABLE WHERE (timestamp_col < CURRENT_TIMESTAMP() - INTERVAL '1 day')
  AS
    SELECT F.primary_key primary_key, F.timestamp_col timestamp_col, D.value dim_value
    FROM fact_table F
    LEFT OUTER JOIN dimension_table D USING (primary_key);
Copy

Beispiel: Dynamische Tabelle mit unbegrenzter Aufbewahrungsdauer und Basistabelle mit eingeschränkter Aufbewahrungsdauer

Das folgende Beispiel erstellt eine Staging-Tabelle mit einem begrenzten Fenster von kürzlich hinzugefügten Daten und einer dynamischen Tabelle, in der alle geparsten und gefilterten Daten gespeichert werden.

CREATE TABLE staging_data (raw TEXT, ts TIMESTAMP);

CREATE DYNAMIC TABLE parsed_data
  TARGET_LAG = '1 minute'
  WAREHOUSE = mywh
  IMMUTABLE WHERE (ts < CURRENT_TIMESTAMP() - INTERVAL '7 days')
  AS
    SELECT parse_json(raw):event_id::string event_id, parse_json(raw):name::string name, parse_json(raw):region::string region, ts
    FROM staging_data WHERE region = 'US';

-- Delete old staging data using Task
CREATE TASK delete_old_staging_data
  WAREHOUSE = mywh
  SCHEDULE = '24 hours'
  AS
    DELETE FROM staging_data WHERE ts < CURRENT_TIMESTAMP() - INTERVAL '30 days';
Copy

Beispiel: Vollständige Aktualisierung mit IMMUTABLE WHERE

Angenommen, eine dynamische Tabelle muss sich aufgrund von Einschränkungen bei Abfragekonstrukten, wie z. B. der Verwendung von Python UDTF, im Modus der vollständigen Aktualisierung befinden . Obwohl dies normalerweise eine inkrementelle Verarbeitung verhindern würde, bleibt beim Definieren einer unveränderlichen Region mit der IMMUTABLE WHERE-Klausel eine nachgelagerte dynamische Tabelle inkrementell, profitiert aber weiterhin von Leistungsoptimierungen, auch wenn die vorgelagerte Tabelle aufgrund von Einschränkungen des Abfragekonstrukts vollständig aktualisiert werden muss.

Das folgende Beispiel zeigt eine dynamische Tabelle, die Python UDTF verwendet und dadurch nicht inkrementiert werden kann:

CREATE FUNCTION my_udtf(x varchar)
  RETURNS TABLE (output VARCHAR)
  LANGUAGE PYTHON
  AS $$ ... $$;

CREATE DYNAMIC TABLE udtf_dt
  TARGET_LAG = '1 hour'
  WAREHOUSE = mywh
  REFRESH_MODE = FULL
  IMMUTABLE WHERE (ts < current_timestamp() - interval '1 day')
  AS
    SELECT ts, data, output, join_key FROM input_table, TABLE(my_udtf(data));

CREATE DYNAMIC TABLE incremental_join_dt
  TARGET_LAG = '1 hour'
  WAREHOUSE = mywh
  REFRESH_MODE = INCREMENTAL
  IMMUTABLE WHERE (ts < current_timestamp() - interval '1 day')
  AS
    SELECT * FROM udtf_dt JOIN dim_table USING (join_key);
Copy

Einschränkungen und Hinweise zum Festlegen von Unveränderlichkeitseinschränkungen

Alle Einschränkungen von regulären dynamischen Tabellen gelten weiterhin.

Außerdem:

  • Es kann nur ein einziges IMMUTABLE WHERE-Prädikat für eine dynamische Tabelle geben. Das Festlegen eines weiteren mit einem ALTER DYNAMIC TABLE … SET IMMUTABLE WHERE-Befehl ersetzt jedes vorhandene Prädikat.

  • IMMUTABLE WHERE-Einschränkungen können die folgenden Elemente nicht enthalten:

    • Unterabfragen

    • Nicht deterministische Funktionen, mit Ausnahme von Zeitstempelfunktionen wie CURRENT_TIMESTAMP() oder CURRENT_DATE(). Wenn Sie Zeitstempelfunktionen verwenden, müssen Sie diese so verwenden, dass der unveränderliche Bereich mit der Zeit größer wird. Beispiel, bei dem dies nicht zutrifft: TIMESTAMP_COL < CURRENT_TIMESTAMP() is allowed but TIMESTAMP_COL > CURRENT_TIMESTAMP().

    • Benutzerdefinierte oder externe Funktionen

    • Spalten für Metadaten, zum Beispiel solche, die mit METADATA$ beginnen.

    • Spalten, die das Ergebnis von Aggregaten, Fensterfunktionen oder nicht deterministischen Funktionen sind, oder Spalten, die über einen Fensterfunktionsoperator übergeben werden In den folgenden dynamischen Tabellen kann nur col3 in IMMUTABLE WHERE-Prädikaten verwendet werden:

      CREATE DYNAMIC TABLE aggregates TARGET_LAG = '1 minute' WAREHOUSE = mywh
        AS SELECT col1, SUM(col2) AS col2 FROM input_table
        GROUP BY col3;
      
      CREATE DYNAMIC TABLE window_fns TARGET_LAG = '1 minute' WAREHOUSE = mywh
        AS SELECT col3, SUM(col4) OVER (PARTITION BY col3 ORDER BY col4) AS col2, col5 FROM input_table;
      
      Copy

IMMUTABLE WHERE-Einschränkungen werden beim Klonen und Replizieren ohne Einschränkungen kopiert.

Erstellen dynamischer Tabellen mithilfe von Backfilling

Backfilling ist eine kopierfreie, kostengünstige Operation, die die Quelldaten sofort in einer dynamischen Tabelle verfügbar macht. Sie können eine dynamische Tabelle mit ersten Daten erstellen, die durch Backfilling aus einer regulären Tabelle aufgefüllt werden, und trotzdem immer noch eine benutzerdefinierte Aktualisierungsabfrage für zukünftige Aktualisierungen definieren.

Bei Unveränderlichkeitseinschränkungen wird nur die unveränderliche Region durch Backfilling aufgefüllt, und sie bleibt unverändert, auch wenn die unveränderliche Region nicht mehr mit der Quelle übereinstimmt. Der veränderbare Bereich wird wie üblich aus der Definition der dynamischen Tabelle und den Basistabellen berechnet.

Nur durch die IMMUTABLE WHERE-Unveränderlichkeitseinschränkung definierte Daten können durch Backfilling aufgefüllt werden, da die aufgefüllten Daten unverändert bleiben müssen, auch wenn sie sich von der vorgelagerten Quelle unterscheiden.

Beispiele für die Verwendung von Backfilling

Die folgenden Beispiele zeigen, wie Sie neue dynamische Tabellen aus Tabellen mit durch Backfilling aufgefüllten Daten erstellen können.

Jeder Spaltenname muss in der Backfilling-Tabelle mit kompatiblen Datentypen vorhanden sein und muss in derselben Reihenfolge wie die Backfilling-Tabelle vorliegen. Tabelleneigenschaften und Berechtigungen werden nicht aus der Backfilling-Tabelle kopiert.

Wenn Time-Travel-Parameter AT | BEFORE angegeben werden, werden die Daten aus der Backfilling-Tabelle zur angegebenen Zeit kopiert.

Beispiel: Backfilling aus einem Teil der Tabelle

Im folgenden Beispiel wird der unveränderlichen Bereich von my_dynamic_table aus my_backfill_table und der veränderliche Bereich aus der Definition der dynamischen Tabelle durch Backfilling aufgefüllt.

Wenn in diesem Szenario die dynamische Tabelle mit inkrementellem Aktualisierungsmodus erstellt wird, löscht die Neuinitialisierung alle Zeilen, die veränderbar sind, und füllt nur den veränderbaren Bereich neu aus. Wenn die dynamische Tabelle mit vollständigem Aktualisierungsmodus erstellt wird, wird eine vollständige Aktualisierung mit derselben Wirkung ausgelöst.

CREATE DYNAMIC TABLE my_dynamic_table (day TIMESTAMP, totalSales NUMBER)
  IMMUTABLE WHERE (day < '2025-01-01')
  BACKFILL FROM my_backfill_table
  TARGET_LAG = '20 minutes'
  WAREHOUSE = 'mywh'
  AS SELECT DATE_TRUNC('day', ts) AS day, sum(price)
    FROM my_base_table
    GROUP BY day;
Copy

Beispiel: Wiederherstellen oder Ändern von Daten in einer dynamischen Tabelle mithilfe von Backfilling

Sie können die Daten oder die Definition einer dynamischen Tabelle nicht direkt bearbeiten. Um Daten wiederherzustellen oder zu korrigieren, führen Sie die folgenden Problemumgehungsschritte aus:

  1. Klonen Sie die dynamische Tabelle in eine reguläre Tabelle.

  2. Ändern Sie die geklonte Tabelle wie erforderlich.

  3. Nehmen Sie ein Backfilling aus der bearbeiteten Tabelle in eine neue dynamische Tabelle vor.

Im folgenden Beispiel aggregiert my_dynamic_table tägliche Verkaufsdaten aus der Basistabelle sales:

CREATE OR REPLACE TABLE sales(item_id INT, ts TIMESTAMP, sales_price FLOAT);

INSERT INTO sales VALUES (1, '2025-05-01 01:00:00', 10.0), (1, '2025-05-01 02:00:00', 15.0), (1, '2025-05-01 03:00:00', 11.0);
INSERT INTO sales VALUES (1, '2025-05-02 00:00:00', 11.0), (1, '2025-05-02 05:00:00', 13.0);


CREATE DYNAMIC TABLE my_dynamic_table
  TARGET_LAG = 'DOWNSTREAM'
  WAREHOUSE = mywh
  INITIALIZE = on_create
  IMMUTABLE WHERE (day <= '2025-05-01')
  AS
    SELECT item_id, date_trunc('DAY', ts) day, count(sales_price) AS sales_count FROM sales
    GROUP BY item_id, day;

SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dynamic_table;
Copy
+---------+------------+-------------+
| ITEM_ID | DAY        | SALES_COUNT |
|---------+------------+-------------|
| 1       | 2025-05-01 | 3           |
| 1       | 2025-05-02 | 2           |
|---------+-------------+------------|

Optional können Sie die alten Daten archivieren, um Speicherkosten zu sparen:

DELETE FROM sales WHERE ts < '2025-05-02';

ALTER DYNAMIC TABLE my_dynamic_table REFRESH;

SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dynamic_table;
Copy

Später finden Sie einen Verkaufsfehler am 2025-05-01, wobei sales_count „2“ sein sollte. So korrigieren Sie dies:

  1. Klonen Sie my_dynamic_table in einer regulären Tabelle:

    CREATE OR REPLACE TABLE my_dt_clone_table CLONE my_dynamic_table;
    
    Copy
  2. Aktualisieren Sie die geklonte Tabelle:

    UPDATE my_dt_clone_table SET
      sales_count = 2
      WHERE day = '2025-05-01';
    
    SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dt_clone_table;
    
    Copy
    +---------+------------+-------------+
    | ITEM_ID | DAY        | SALES_COUNT |
    |---------+------------+-------------|
    | 1       | 2025-05-01 | 2           |
    | 1       | 2025-05-02 | 2           |
    |---------+-------------+------------|
    
  3. Erstellen Sie die dynamische Tabelle neu, indem Sie den bearbeiteten Klon als Backfilling-Quelle verwenden.

    CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table
      BACKFILL FROM my_dt_clone_table
      IMMUTABLE WHERE (day <= '2025-05-01')
      TARGET_LAG = 'DOWNSTREAM'
      WAREHOUSE = mywh
      INITIALIZE = on_create
      AS
        SELECT item_id, date_trunc('DAY', ts) day, count(sales_price) AS sales_count FROM sales
        GROUP BY item_id, day;
    
    Copy

    Mit diesem Ansatz können Sie Daten in einer dynamischen Tabelle wiederherstellen oder korrigieren, ohne die Basistabelle ändern zu müssen:

    SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dynamic_table;
    
    Copy
    +---------+------------+-------------+
    | ITEM_ID | DAY        | SALES_COUNT |
    |---------+------------+-------------|
    | 1       | 2025-05-01 | 2           |
    | 1       | 2025-05-02 | 2           |
    |---------+-------------+------------|
    

Beispiel: Ändern des Schemas einer dynamischen Tabelle mithilfe von Backfilling

Sie können das Schema einer dynamischen Tabelle nicht direkt ändern. Um das Schema zu aktualisieren, z. B. eine Spalte hinzuzufügen, gehen Sie wie folgt vor:

  1. Klonen Sie die dynamische Tabelle in eine reguläre Tabelle. Im folgenden Beispiel wird my_dynamic_table verwendet, die aus sales erstellt wurde (siehe oben).

    CREATE OR REPLACE TABLE my_dt_clone_table CLONE my_dynamic_table;
    
    Copy
  2. Ändern Sie das Schema der geklonten Tabelle:

    ALTER TABLE my_dt_clone_table ADD COLUMN sales_avg FLOAT;
    
    SELECT item_id, to_char(day, 'YYYY-MM-DD') as DAY, SALES_COUNT, SALES_AVG FROM my_dt_clone_table;
    
    Copy
  3. Optional können Sie die neue Spalte mit Daten füllen.

  4. Erstellen Sie die dynamische Tabelle neu, indem Sie den bearbeiteten Klon als Backfilling-Quelle verwenden.

    CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table
      BACKFILL FROM my_dt_clone_table
      IMMUTABLE WHERE (day <= '2025-05-01')
      TARGET_LAG = 'DOWNSTREAM'
      WAREHOUSE = mywh
      INITIALIZE = on_create
      AS
        SELECT item_id, date_trunc('DAY', ts) day, count(sales_price) AS sales_count, avg(sales_price) as sales_avg FROM sales
        GROUP BY item_id, day;
    
    Copy

    Mit diesem Ansatz können Sie Daten in einer dynamischen Tabelle wiederherstellen oder korrigieren, ohne die Basistabelle ändern zu müssen:

    SELECT item_id, to_char(day, 'YYYY-MM-DD') as DAY, SALES_COUNT, SALES_AVG, metadata$is_immutable as IMMUTABLE from my_dynamic_table ORDER BY ITEM_ID, DAY;
    
    Copy
    +---------+------------+-------------+-----------+-----------+
    | ITEM_ID | DAY        | SALES_COUNT | SALES_AVG | IMMUTABLE |
    |---------+------------+-------------|-----------|-----------|
    | 1       | 2025-05-01 | 3           | NULL      | TRUE      |
    | 1       | 2025-05-02 | 2           | 12        | FALSE     |
    |---------+-------------+------------+-----------|-----------+
    

Einschränkungen und Hinweise beim Erstellen einer dynamischen Tabelle mit durch Backfilling aufgefüllten Daten

Alle Einschränkungen von regulären dynamischen Tabellen und die -Unveränderlichkeitseinschränkungen gelten weiterhin.

Es gelten die folgenden zusätzlichen Einschränkungen und Hinweise:

  • Derzeit können nur reguläre Tabellen für das Backfilling verwendet werden.

  • Sie können in der neuen dynamischen Tabelle keine Richtlinien oder Tags angeben, da diese aus der Backfilling-Tabelle kopiert werden.

  • Die Gruppierungsschlüssel in der neuen dynamischen Tabelle und der Backfilling-Tabelle müssen identisch sein.

Best Practices für das Erstellen dynamischer Tabellen

Pipelines dynamischer Tabellen verketten

Wenn Sie eine neue dynamische Tabelle definieren, sollten Sie keine große dynamische Tabelle mit vielen verschachtelten Anweisungen definieren, sondern stattdessen kleine dynamische Tabellen mit Pipelines verwenden.

Sie können eine dynamische Tabelle einrichten, um andere dynamische Tabellen abzufragen. Stellen Sie sich zum Beispiel ein Szenario vor, in dem Ihre Datenpipeline Daten aus einer Staging-Tabelle extrahiert, um verschiedene Dimensionstabellen zu aktualisieren (z. B. customer, product, date und time). Außerdem aktualisiert Ihre Pipeline eine aggregierte sales-Tabelle, die auf den Informationen aus diesen Dimensionstabellen basiert. Indem Sie die Dimensionstabellen so konfigurieren, dass sie die Staging-Tabelle abfragen, und die aggregierte sales-Tabelle so, dass sie die Dimensionstabellen abfragt, erzeugen Sie einen Kaskadeneffekt, ähnlich wie bei einem Task-Graphen.

In diesem Setup wird die Aktualisierung der aggregierten sales-Tabelle erst ausgeführt, nachdem die Aktualisierungen der Dimensionstabellen erfolgreich abgeschlossen wurden. Dies stellt die Konsistenz der Daten und die Einhaltung der Verzögerungsziele sicher. Durch einen automatischen Aktualisierungsprozess lösen alle Änderungen in den Quelltabellen zu den entsprechenden Zeitpunkten Aktualisierungen in allen abhängigen Tabellen aus.

Vergleich zwischen Task-Graphen und DAGs dynamischer Tabellen

Dynamische „Controller“-Tabelle für komplexe Task-Graphen verwenden

Wenn Sie einen komplexen Graphen von dynamischen Tabellen mit vielen Wurzeln und Blättern haben und mit einem einzigen Befehl Operationen (z. B. Änderung der Verzögerung, manuelle Aktualisierung, Aussetzung) am gesamten Task-Graphen ausführen möchten, gehen Sie wie folgt vor:

  1. Setzen Sie den Wert für TARGET_LAG für alle Ihre dynamischen Tabellen auf DOWNSTREAM.

  2. Erstellen Sie eine dynamische „Controller“-Tabelle, die alle Blätter in Ihrem Task-Graphen ausliest. Um sicherzustellen, dass dieser Controller keine Ressourcen verbraucht, gehen Sie wie folgt vor:

    CREATE DYNAMIC TABLE controller
      TARGET_LAG = <target_lag>
      WAREHOUSE = <warehouse>
      AS
        SELECT 1 A FROM <leaf1>, …, <leafN> LIMIT 0;
    
    Copy
  3. Verwenden Sie den Controller, um den gesamten Task-Graphen zu steuern. Beispiel:

  • Legen Sie eine neue Zielverzögerung für den Task-Graphen fest.

    ALTER DYNAMIC TABLE controller SET
      TARGET_LAG = <new_target_lag>;
    
    Copy
  • Aktualisieren Sie den Task-Graphen manuell.

    ALTER DYNAMIC TABLE controller REFRESH;
    
    Copy

Verwenden Sie transiente dynamische Tabellen, um die Speicherkosten zu reduzieren

Transiente dynamische Tabellen halten Daten zuverlässig über die Zeit aufrecht und unterstützen Time Travel innerhalb der Datenaufbewahrungsfrist, bewahren aber keine Daten über die Fail-safe-Frist hinaus auf. Standardmäßig werden die dynamischen Tabellendaten sieben Tage lang im Fail-safe-Speicher aufbewahrt.

Bei dynamischen Tabellen mit hohem Aktualisierungsdurchsatz kann dies den Speicherverbrauch erheblich erhöhen. Daher sollten Sie eine dynamische Tabelle nur dann zu einer transienten Tabelle machen, wenn ihre Daten nicht dasselbe Maß an Datenschutz und Wiederherstellung benötigen, das permanente Tabellen bieten.

Mit der Anweisung CREATE DYNAMIC TABLE können Sie eine transiente dynamische Tabelle erstellen oder bestehende dynamische Tabellen in transiente dynamische Tabellen klonen.

Probleme beim Erstellen dynamischer Tabellen lösen

Wenn Sie eine dynamische Tabelle erstellen, erfolgt die anfängliche Aktualisierung entweder nach einem Zeitplan (ON_SCHEDULE) oder sofort bei der Erstellung (ON_CREATE). Die erstmalige Datenbefüllung oder Initialisierung hängt davon ab, wann diese erste Aktualisierung stattfindet. Beispiel: Für ON_CREATE kann die Initialisierung länger dauern, wenn sie Aktualisierungen der vorgelagerten dynamischen Tabellen auslöst.

Die Initialisierung kann einige Zeit dauern, je nachdem, wie viele Daten gescannt werden. Um den Fortschritt zu sehen, gehen Sie wie folgt vor:

  1. Melden Sie sich bei Snowsight an.

  2. Wählen Sie im Navigationsmenü die Option Monitoring » Query History aus.

  3. In der Dropdown-Liste Filters geben Sie CREATE DYNAMIC TABLE als SQL Text-Filter und Ihren Warehouse-Namen als Warehouse-Filter ein.

  4. Wählen Sie unter SQL text die Abfrage mit Ihrer dynamischen Tabelle aus, und verwenden Sie die Registerkarten Query Details und Query Profile, um den Fortschritt zu verfolgen.