Schema Change Tracking

  • Anton Revyako
    Anton Revyako

    Founder of dwh.dev

Schema Change Tracking

Schema Change Tracking in Snowflake: Why Query History Wins

When most data-lineage tools attempt to track schema changes in Snowflake, they start with the obvious option — reading the current state from INFORMATIONSCHEMA or SNOWFLAKE.ACCOUNTUSAGE. It’s simple. It’s familiar. But it’s not the right foundation for reliable lineage.

The Problem with INFORMATION_SCHEMA Snapshots

Even if you accept the inherent latency, several structural limitations remain:

  • it’s not real-time and may lag behind actual changes
  • metadata is incomplete — reconstructing full DDL is nearly impossible
  • you only see the current state, losing everything that happened between snapshots
  • you need broad, future-proof privileges for objects that don’t yet exist

If your lineage or cost analytics rely on this layer, you’re essentially reconstructing history through a keyhole.

The Better Alternative: Querying Snowflake’s QUERY_HISTORY

Instead of guessing what happened by looking at the final state, you can examine the actual source of truth: every CREATE and ALTER statement executed in the account.

This requires parsing, compiling, and applying each statement to a continuously evolving schema model. It’s complex — but the payoff is substantial.

Benefits of Query-History–Driven Schema Tracking:

  • full historical evolution of every object, including intermediate states
  • up to a year of history, not just from the first snapshot
  • accurate CTAS rebuild-cost analytics for any time window
  • precise detection of every moment when CTAS or VIEW logic changed
  • anomaly detection in CTAS rebuild row counts
  • a robust foundation for accurate, column-level lineage

This approach yields the fidelity required for serious data engineering.

How Dwh.dev Implements This

When installed from the Snowflake Marketplace, Dwh.dev reconstructs schema history directly from QUERY_HISTORY, giving you a complete and trustworthy audit of your Snowflake metadata.

  • no external services
  • works even on Standard Edition (no dependency on ACCESS_HISTORY)
  • all processing stays entirely within your Snowflake account
  • full-spectrum lineage across all Snowflake object types — not just TABLEs and VIEWs