← Back to blog
· Snowflake· Data Engineering

Snowflake Dynamic Tables

Five upgrades to Snowflake Dynamic Tables — smarter incremental refreshes, better monitoring, expanded SQL support, and live warehouse swaps.

What's new with Snowflake Dynamic Tables.

1. Smarter incremental refreshes

Snowflake has fine-tuned the incremental engine driving Dynamic Tables. Updates now apply only the changes since the last refresh, making it ideal for large datasets with frequent small updates. Less data is reprocessed, so refreshes are quicker and don't hammer your warehouse as hard.

Why it matters: app devs get fresher data for UIs without lag spikes. Data scientists see faster updates for models. Data engineers save on compute costs.

2. Enhanced downstream lag

The TARGET_LAG = 'DOWNSTREAM' option — where refreshes kick off based on downstream needs — got an upgrade. It's now sharper at handling chained Dynamic Tables (like one feeding another). Updates ripple through more smoothly when you have dependencies.

CREATE OR REPLACE DYNAMIC TABLE downstream_sales
  TARGET_LAG = 'DOWNSTREAM'
  WAREHOUSE  = my_warehouse
AS
  SELECT *
    FROM daily_sales_by_region
   WHERE total_sales > 100;

3. Better monitoring tools

The INFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORY() view picked up new tricks, including REFRESH_TRIGGER columns. Pair that with tighter Resource Monitor integration and you've got a clearer read on what's eating your credits and why refreshes fire.

SELECT NAME, REFRESH_TRIGGER, STATISTICS, REFRESH_END_TIME
  FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORY())
 WHERE NAME = 'DAILY_SALES_BY_REGION';

Why it matters: debug faster — spot whether a refresh tanked from bad SQL or heavy data — and keep your budget in line.

4. Expanded transformation support

You can now use more complex SQL in Dynamic Tables, including CTEs and subqueries. Recent updates (Q4 2024) loosened the old limits, so nested logic doesn't trip you up as much.

CREATE OR REPLACE DYNAMIC TABLE sales_trends
  TARGET_LAG = '1 hour'
  WAREHOUSE  = my_warehouse
AS
  WITH ranked_sales AS (
    SELECT
      region,
      sale_amount,
      ROW_NUMBER() OVER (
        PARTITION BY region
        ORDER BY event_timestamp DESC
      ) AS rn
    FROM sales_events
  )
  SELECT region, sale_amount
    FROM ranked_sales
   WHERE rn = 1;

Why it matters: data scientists can bake in ranking or trend logic. App devs get richer data without extra processing steps.

5. Warehouse swaps on the fly

No need to rebuild a table to change its warehouse anymore. A quick ALTER lets you swap compute power as loads shift — handy when refreshes start dragging.

ALTER DYNAMIC TABLE daily_sales_by_region
  SET WAREHOUSE = bigger_warehouse;

Why it matters: data engineers can tweak performance without downtime — keeps things humming.