duckdbsnowflakecost-reductiondata-warehouse

Substituímos Nosso Snowflake de $8k/mês por DuckDB e Parquet

Michael San Martim · 2026-04-23

Esta é a história de como fomos de $8.000/mês no Snowflake para $0/mês — sem perder nada que importava para nossa equipe de 12 analistas.

O Problema

Nossa conta do Snowflake crescia 20% mês a mês. Tínhamos:

  • 2,3 TB de dados em 47 tabelas
  • 12 analistas executando consultas
  • 90% das consultas eram simples: agregações, filtros, joins em 3-4 tabelas
  • A consulta média escaneava menos de 50 GB
  • O warehouse ficava ocioso 18 horas/dia

Estávamos pagando preços de data warehouse enterprise para cargas de trabalho que um laptop poderia lidar.

A Descoberta

Arquivos Parquet no S3 + DuckDB = um data warehouse grátis para nossa escala.

O DuckDB pode:

  • Ler Parquet diretamente do S3 (sem COPY INTO, sem staging)
  • Executar SQL complexo com joins, window functions, CTEs
  • Processar 50 GB em segundos em uma única máquina
  • Fazer cache de resultados para consultas repetidas

A peça que faltava era ferramental. Precisávamos de:

  • Descoberta de tabelas (o que tem no bucket?)
  • Gerenciamento de schema (quais colunas existem?)
  • Uma interface de consulta para analistas
  • Integração de IA para usuários de negócio

O DataSpoc Lens forneceu tudo isso.

A Migração

Passo 1: Exportar do Snowflake para Parquet

Já tínhamos nossos dados brutos no S3 (o Snowflake carregava de lá). Para tabelas curadas, exportamos:

Terminal window
pip install dataspoc-pipe
# We used Pipe to extract our Snowflake curated tables to Parquet
dataspoc-pipe add snowflake \
--account xy12345.us-east-1 \
--database ANALYTICS \
--schema CURATED \
--tables revenue,customers,products,orders,sessions \
--destination s3://company-lake

A migração única levou 15 minutos para 2,3 TB.

Passo 2: Apontar o Lens para o Bucket

Terminal window
pip install dataspoc-lens
dataspoc-lens add-bucket s3://company-lake
dataspoc-lens discover

Saída:

Discovered 47 tables in s3://company-lake:
raw/postgres/orders (1.2M rows, 340 MB)
raw/postgres/customers (89K rows, 12 MB)
raw/postgres/products (2.4K rows, 1.1 MB)
curated/finance/revenue (4.2M rows, 890 MB)
curated/product/sessions (12M rows, 2.1 GB)
...

Passo 3: Consultar Como no Snowflake

O SQL é idêntico. Cada consulta que tínhamos no Snowflake funcionou no DuckDB sem modificação:

Snowflake:

-- snowflake worksheet
SELECT
DATE_TRUNC('month', order_date) AS month,
product_category,
SUM(amount) AS revenue,
COUNT(DISTINCT customer_id) AS unique_customers
FROM analytics.curated.revenue
WHERE order_date >= '2024-01-01'
GROUP BY 1, 2
ORDER BY 1, 2;

DataSpoc Lens (mesmo SQL):

Terminal window
dataspoc-lens query "
SELECT
DATE_TRUNC('month', order_date) AS month,
product_category,
SUM(amount) AS revenue,
COUNT(DISTINCT customer_id) AS unique_customers
FROM curated.finance.revenue
WHERE order_date >= '2024-01-01'
GROUP BY 1, 2
ORDER BY 1, 2
"

Mesmos resultados. Custo zero. 1,2 segundos em vez de 3,4 segundos (warehouse XS do Snowflake).

Passo 4: Dar aos Analistas um Shell Interativo

Terminal window
dataspoc-lens shell
DataSpoc Lens Shell (DuckDB 0.10.1)
Connected to: s3://company-lake (47 tables)
Type .tables to list, .schema <table> to inspect, .quit to exit
lens> .tables
┌─────────────────────────────────┬──────────┬─────────┐
│ table │ rows │ size │
├─────────────────────────────────┼──────────┼─────────┤
│ curated.finance.revenue │ 4.2M │ 890 MB │
│ curated.product.sessions │ 12M │ 2.1 GB │
│ raw.postgres.orders │ 1.2M │ 340 MB │
│ raw.postgres.customers │ 89K │ 12 MB │
│ ... │ │ │
└─────────────────────────────────┴──────────┴─────────┘
lens> SELECT COUNT(*) FROM curated.finance.revenue WHERE order_date >= '2024-01-01';
┌──────────┐
│ count │
├──────────┤
│ 1847293 │
└──────────┘
(0.4s)

Analistas que sabiam SQL foram produtivos imediatamente. Sem retreinamento.

Passo 5: IA Ask para Usuários de Negócio

Para o CEO e PMs que não escrevem SQL:

Terminal window
dataspoc-lens ask "What was our MRR growth last quarter?"
Based on curated.finance.revenue:
MRR grew from $1.23M (Jul 2024) to $1.47M (Sep 2024), a 19.5% increase
over Q3. The strongest month was September (+8.2% MoM), driven by
Enterprise plan upgrades.
SQL used:
SELECT DATE_TRUNC('month', order_date) AS month,
SUM(amount) AS mrr
FROM curated.finance.revenue
WHERE order_date >= '2024-07-01' AND order_date < '2024-10-01'
AND revenue_type = 'recurring'
GROUP BY 1 ORDER BY 1

A IA mostra seu trabalho — a consulta SQL exata — para que analistas possam verificar.

Comparação de Performance

Fizemos benchmark das nossas 20 consultas mais comuns:

Tipo de ConsultaSnowflake (XS)DataSpoc Lens (DuckDB)
Agregação simples (1 tabela)1,8s0,3s
Join 2 tabelas + group by3,2s1,1s
Window function sobre 1M linhas4,1s1,8s
Full table scan 12M linhas6,7s4,2s
CTE complexo com 4 joins8,3s3,9s

DuckDB foi mais rápido para cada consulta individual na nossa escala. O segredo: sem round-trip de rede para um warehouse na nuvem, o formato colunar do Parquet significa que o DuckDB só lê as colunas necessárias, e leituras S3 são paralelizadas.

A Comparação de Custos

Centro de CustoSnowflakeDataSpoc Lens
Compute (warehouse)$6.200/mês$0
Armazenamento (gerenciado)$1.800/mês$0 (já pagando pelo S3)
Armazenamento S3$47/mês$47/mês (mesmos dados)
Requisições S3 GET$12/mês
Licença DataSpoc Lens$0 (open source)
Total$8.047/mês$59/mês

Economia anual: $95.856.

O Que Ganhamos

Além da economia de custos:

  1. Sem gerenciamento de warehouse. Sem dimensionamento, sem ajuste de auto-suspend, sem monitoramento de créditos.
  2. Início instantâneo. Sem cold-start do warehouse (15-45 segundos no Snowflake).
  3. Desenvolvimento local. Analistas podem consultar os mesmos dados localmente com dataspoc-lens shell.
  4. Nativo para IA. Servidor MCP significa que Claude, GPT e agentes internos consultam nossos dados diretamente.
  5. Portável. Sem lock-in de fornecedor. Parquet é um formato aberto.

O Que Perdemos (e ressalvas honestas)

Esta abordagem NÃO substitui o Snowflake se você tem:

RequisitoSnowflakeDataSpoc Lens
50+ analistas simultâneosLida com issoÚnico usuário por processo
Dados em escala de petabytesCompute distribuídoMáquina única (limite ~100 GB efetivo)
RBAC granularRoles + políticas nativasBaseado em IAM (nível de bucket)
Time travel / versionamentoIntegradoVocê gerencia versões do Parquet
Semi-estruturado (JSON)Tipo VARIANTFunções JSON do DuckDB (funciona, menos elegante)
Governança / lineageNativo + parceirosFaça você mesmo
Compartilhamento de dadosSecure sharesCompartilhe o bucket (menos governado)

Nossa regra de ouro: Se seus dados cabem na memória de uma única máquina (até ~100 GB ativamente consultados), você provavelmente não precisa de um warehouse na nuvem. Isso cobre 80% das startups e empresas de médio porte.

O Playbook de Migração

Para equipes considerando isso:

  1. Audite seu uso do Snowflake. Execute ACCOUNT_USAGE.QUERY_HISTORY — verifique volumes de dados e concorrência.
  2. Se 90% das consultas escaneiam < 50 GB: você é candidato.
  3. Exporte tabelas curadas para Parquet no S3. Use DataSpoc Pipe ou COPY INTO com formato Parquet.
  4. Configure o Lens. pip install dataspoc-lens && dataspoc-lens add-bucket s3://your-bucket
  5. Execute suas top 20 consultas. Valide correção e performance.
  6. Migre analistas gradualmente. Mantenha o Snowflake vivo por 1 mês como fallback.
  7. Desligue o warehouse.
Terminal window
# The full migration in 4 commands
pip install dataspoc-pipe dataspoc-lens
dataspoc-pipe add snowflake --account YOUR_ACCOUNT --tables ALL --destination s3://your-lake
dataspoc-pipe run
dataspoc-lens add-bucket s3://your-lake
dataspoc-lens shell # You're done

Um Ano Depois

12 meses após a migração:

  • Economizamos $95K em custos de Snowflake
  • Performance de consultas melhorou (sem cold starts)
  • Analistas estão mais satisfeitos (shell instantâneo, AI Ask)
  • Zero incidentes relacionados à migração
  • Adicionamos servidor MCP para que bots de produto consultem dados autonomamente

Os $8K/mês estavam comprando coisas que não precisávamos. Para equipes na nossa escala, o data warehouse na nuvem é um problema resolvido — e a solução é grátis.

Recomendados