Verwenden von Unveränderlichkeitseinschränkungen für dynamische Tabellen

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

  • Backfilling dynamischer Tabellen mit Unveränderlichkeitseinschränkungen Weitere Informationen dazu finden Sie unter Erstellen dynamischer Tabellen mithilfe von Backfilling.

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. 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 in der folgenden SQL-Anweisung kann nur id1 verwenden, nicht id:

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

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.

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: Verwenden Sie IMMUTABLE WHERE, um inkrementelle nachgelagerte Aktualisierungen zu aktivieren, wenn die vorgelagerte dynamische Tabelle im Modus der vollständigen Aktualisierung ausgeführt wird.

Einige Abfragekonstrukte, wie z. B. benutzerdefinierte Python-Tabellenfunktionen (UDTFs) erfordern, dass die dynamische Tabelle im Modus der vollständigen Aktualisierung ausgeführt wird. In der Regel verhindert diese Beschränkung eine inkrementelle Verarbeitung. Damit nachgelagerte Tabellen inkrementell bleiben, können Sie mit der IMMUTABLE WHERE-Klausel eine unveränderliche Region definieren, wie im folgenden Beispiel gezeigt. Auf diese Weise profitieren nachgelagerte Tabellen von den Leistungsoptimierungen, auch wenn die vorgelagerte Tabelle vollständige Aktualisierungen erfordert.

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

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

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

  • Alle Einschränkungen von regulären dynamischen Tabellen gelten weiterhin. Zusätzlich gelten die folgenden Einschränkungen:

    • Es kann nur ein einziges IMMUTABLE WHERE-Prädikat für eine dynamische Tabelle geben. Das Festlegen eines weiteren Prädikats 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 nutzen, müssen Sie diese so verwenden, dass der unveränderliche Bereich mit der Zeit nicht kleiner werden kann. 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 col3, 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
    • 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 WHERE;
      
      Copy