1. Assess with usage data
Query the source's logs (Teradata DBQL, Netezza query history) for 3–6 months:
- Which tables are actually read, by whom, how often.
- Top queries by CPU and runtime — your performance test set.
- Unused objects to leave behind.
2. Convert schemas
| Teradata/Netezza | Snowflake |
|---|---|
PRIMARY INDEX, DISTRIBUTE ON | Nothing (micro-partitions); clustering keys only for very large tables |
MULTISET / SET tables | Standard tables (SET duplicate elimination must be handled in loads) |
VARCHAR(n) CHARACTER SET LATIN | VARCHAR (UTF-8) |
BYTEINT | NUMBER(3,0) |
| Volatile / global temporary tables | TEMPORARY / TRANSIENT tables |
| Stored procedures (SPL, NZPLSQL) | Snowflake Scripting / JavaScript / Python procedures |
| BTEQ / nzsql scripts | SnowSQL / Snowflake CLI scripts, dbt, tasks |
Use a conversion tool (Snowflake's SnowConvert supports Teradata and others) for DDL, views, procedures and BTEQ, then review the flagged items manually.
3. Move historical data
- Export tables to compressed files (TPT export /
nzunload/ external tables) — Parquet if possible, otherwise gzip CSV. - Upload to cloud storage close to the Snowflake account (AzCopy/S3 CLI, or offline devices for hundreds of TB).
- Load with
COPY INTOfrom an external stage:
CREATE STAGE mig_stage URL='azure://stmig.blob.core.windows.net/export/' STORAGE_INTEGRATION = mig_int;
COPY INTO edw.sales.transactions
FROM @mig_stage/transactions/
FILE_FORMAT = (TYPE = PARQUET) MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE
ON_ERROR = ABORT_STATEMENT;
Use a dedicated larger warehouse for bulk loads and suspend it afterwards.
4. Rebuild incremental loads
Point ingestion at Snowflake (Snowpipe for files, connectors/partners for CDC) and re-implement transformation jobs (dbt or Snowflake tasks). Run them in parallel with the old warehouse.
5. Test and reconcile
- Row counts and checksums per table (
HASH_AGG(*)in Snowflake vs. equivalent aggregates in the source). - Report-level comparison: top 50 reports run against both, results diffed.
- Performance: top queries from step 1 within agreed thresholds; tune with clustering keys or materialised views only where needed.
6. Cut over
Freeze the old warehouse for writes, run a final incremental sync, switch BI connections (Power BI, Tableau, MicroStrategy) and ODBC/JDBC users, and keep the old system read-only for an agreed period.
Tip
Set up Snowflake cost guardrails before users arrive: resource monitors per warehouse, auto-suspend at 60 seconds, and separate warehouses for loads, BI and data science.
Checklist
- Usage-based inventory; unused objects excluded
- DDL/SQL/procedures converted and reviewed
- History loaded and reconciled
- Loads rebuilt and running in parallel
- BI switched; resource monitors on; appliance decommissioned