Snowflake storage tiering is the practice of systematically moving infrequently accessed or archival data from high-cost internal Snowflake storage to lower-cost tiers—such as external cloud object stores—while preserving query access and data-retention requirements.
Snowflake’s pay-as-you-go model lets teams scale elastically, but leaving every byte in the default internal storage tier can inflate monthly bills. Storage tiering reduces cost by placing hot, warm, and cold data on increasingly inexpensive media—yet still keeps the data queryable through Snowflake’s external table, Iceberg, and data lifecycle management features.
Unlike compute, storage fees in Snowflake accrue 24 × 7. Organizations that ingest terabytes or petabytes of raw logs, IoT telemetry, or historical snapshots often discover that storage outpaces compute as the primary cost driver. By introducing a disciplined tiering strategy you can:
Data loaded directly into Snowflake tables is compressed, encrypted, and stored in Snowflake-managed cloud object storage. Pricing (as of 2024-06) is roughly $23/TB/month after compression.
Fail-safe (7 days) and Time Travel (1–90 days) use additional internal storage. Even if a row is logically deleted, physical bytes persist until the windows expire.
Snowflake can query data that lives in your own Amazon S3, Azure Data Lake Storage (ADLS), or Google Cloud Storage (GCS) through:
Because you pay the cloud provider’s native object-store prices (≈$21/TB for S3 Standard, $10/TB for S3 Infrequent Access, $2–$4/TB for archival tiers), large savings are possible.
Start by labeling each schema or table as Hot (queried daily), Warm (queried weekly/monthly), or Cold (rarely queried but must be retained). Query histories in SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
and STORAGE_USAGE_DAILY
help with this classification.
Decide how long a table must remain in the internal tier before offloading. For example:
Snowflake supports multiple patterns:
COPY INTO @stage
to export aged partitions.Pair STREAM
s (change data capture) with TASK
s to empty internal partitions once data lands externally, guaranteeing no data loss.
Create a UNION ALL
view that stitches hot (internal) and cold (external/Iceberg) layers, keeping BI dashboards and downstream tools agnostic.
COPY INTO
an external stage in Parquet with compression snappy
.TASK
that runs daily.-- 1. Stage for warm+cold tier
CREATE OR REPLACE STAGE my_s3_stage
URL = 's3://acme-archive/clickstream/'
FILE_FORMAT = (TYPE = PARQUET COMPRESSION = SNAPPY);
-- 2. Task to offload data older than 90 days
CREATE OR REPLACE TASK offload_clickstream_90d
WAREHOUSE = tiering_wh
SCHEDULE = 'USING CRON 0 5 * * * America/Los_Angeles'
AS
DECLARE
offload_date DATE := DATEADD('day', -90, CURRENT_DATE());
BEGIN
-- a) Export to S3
COPY INTO @my_s3_stage/clickstream_90d_
FROM (
SELECT * FROM analytics.clickstream
WHERE event_date < offload_date
)
FILE_FORMAT = (TYPE = PARQUET COMPRESSION = SNAPPY)
SINGLE = FALSE;
-- b) Delete exported rows (shallow copy remains in Time Travel for 1 day)
DELETE FROM analytics.clickstream WHERE event_date < offload_date;
END;
The UNLOAD-then-DELETE pattern keeps recent data hot while archiving older partitions.
Use the following query to monitor total bytes in each tier:
SELECT
TO_DATE(usage_date) AS day,
SUM(bytes) / 1e9 AS gb,
storage_type
FROM SNOWFLAKE.ACCOUNT_USAGE.STORAGE_USAGE_DAILY
WHERE table_name IN ('CLICKSTREAM', 'CLICKSTREAM_EXTERNAL')
GROUP BY day, storage_type;
Combine with cloud-provider object-store metrics to estimate blended $/TB.
COPY INTO
and predicate pushdown.POLICY
objects to document retention policies.Offloading doesn’t mean losing access; views can seamlessly query external data.
Long windows dramatically increase internal storage usage; treat it as premium storage.
Without automation, data will accumulate again. Pair tiering with scheduled TASK
s.
While Galaxy is a SQL editor—not a storage platform—it accelerates tiering projects by:
ACCOUNT_USAGE
views, helping you audit storage quickly.TASK
via Galaxy Collections, preventing divergent scripts in Slack.COPY INTO
commands and spot missing partitions.Snowflake’s elasticity is powerful, but unchecked storage growth can erode budgets. By adopting a disciplined, automated storage-tiering strategy—classifying data, reducing Time Travel, offloading to external or Iceberg tables, and surfacing the right views—you can cut storage costs by 40–80 % while keeping data available for analytics.
Storage often becomes the dominant cost factor in Snowflake deployments. Implementing tiering lets organizations keep explosive data growth in check without sacrificing analytical capability, helping teams meet budget targets, improve query performance on hot data, and remain compliant with retention mandates.
Queries on hot data remain fast because it stays in internal storage. Cold queries may read from external object storage, which is marginally slower, but you can mitigate this by partition pruning and caching.
Yes. External and Iceberg tables integrate with the same role-based access control you use for internal tables, ensuring consistent security.
You can reload Parquet files with COPY INTO
or simply query them in place through external tables. For frequently accessed partitions, consider re-inserting them into an internal clone.
Galaxy’s AI Copilot writes and optimizes COPY INTO
and Stream/Task scripts, while Collections let teams share endorsed tiering workflows—eliminating version drift across Slack or Notion.