How Snowflake Storage Billing Works

Snowflake charges for storage based on the average amount of data stored per month. This includes active table data, Time Travel history, Fail-safe copies, internal stages, and external table metadata. Data is compressed by Snowflake columnar storage, typically achieving 2-4x compression ratios. The billing is based on compressed bytes.

Time Travel: The Biggest Storage Multiplier

Time Travel stores historical versions of changed data for a configurable period from 1 to 90 days. Every UPDATE and DELETE operation creates additional storage. For tables with high change volumes, Time Travel can 2-5x the active storage size. Optimize by setting shorter retention periods for staging and intermediate tables. One day is usually sufficient. Set longer retention only for business-critical dimensions and facts.

Fail-Safe and Why It Matters

Fail-safe is a mandatory 7-day storage period for Snowflake internal disaster recovery. It cannot be disabled. Fail-safe storage for active tables with high change volumes accumulates on top of Time Travel, and it is billed even after tables are dropped for 7 days after the drop. Frequent large table drops and recreates common in dbt full refresh models accumulate Fail-safe storage.

Stage Cleanup: Often Forgotten

Internal Snowflake stages used for data loading accumulate files over time if cleanup is not automated. Always include REMOVE or PURGE TRUE in your COPY INTO statements or add a stage cleanup step to your pipeline. Audit INFORMATION_SCHEMA.STAGES to identify stages with unexpected storage volumes.

Duplicate and Unused Tables

Development and analytics environments accumulate tables that were created for investigation or testing and were never cleaned up. Implement a quarterly table audit: identify tables not queried in the last 90 days, notify owners, and archive or drop unused objects. Create a data catalog policy that requires explicit ownership for tables above a size threshold.

Clustering and Storage Overhead

Automatic clustering maintains micro-partition order by consuming additional storage for maintenance operations. The overhead is typically 10-20% above base table storage. For small tables or tables with infrequent range queries, the cost may not be justified. Review SYSTEM$CLUSTERING_INFORMATION to understand cluster depth and maintenance frequency for each clustered table.

Identify storage waste with Anavsan

APEX surfaces Time Travel cost by table, stage cleanup opportunities, and unused object recommendations, making storage optimization systematic rather than ad-hoc.

Frequently Asked Questions

The main drivers are Time Travel history for high-change tables, Fail-safe storage on frequently updated tables, uncleaned internal stages, duplicate development tables, and clustering maintenance overhead.
Set shorter Time Travel retention for staging and intermediate tables (1 day is sufficient). Reserve longer retention only for critical business tables. Drop Time Travel history explicitly before replacing large tables.
No. Fail-safe is a mandatory 7-day protection period managed by Snowflake and cannot be disabled. However, you can reduce Fail-safe storage by minimizing large table drops and recreates in favor of incremental updates.