Já quiseste fazer uma query SQL a um ficheiro CSV sem o importar para uma base de dados? Ou analisar gigabytes de dados sem montar um cluster? É exatamente isso que o DuckDB faz.
Conheci o DuckDB há uns anos, num projeto onde precisava de processar logs de servidor em Parquet — centenas de milhões de linhas. Montar PostgreSQL, importar tudo, criar índices… parecia excesso de trabalho para uma análise exploratória. O DuckDB resolveu-me o problema em minutos.
Desde então, tenho usado cada vez mais. Vou explicar-te o que é, quando usar, e sobretudo quando não usar.
O que é o DuckDB?
O DuckDB é uma base de dados SQL open-source (licença MIT) desenhada para cargas de trabalho analíticas (OLAP). Foi criada no Centrum Wiskunde & Informatica (CWI) nos Países Baixos, o mesmo centro de investigação que nos deu o Python, ironicamente.
A grande diferença? O DuckDB é embutido — não há servidor, não há portas a abrir, não há configuração. Funciona como o SQLite, mas para análises, não para transacções.
pip install duckdb
É só isto. Depois abres um terminal ou um Jupyter notebook e começas a fazer queries.
import duckdb
duckdb.sql("SELECT avg(price), count(*) FROM 'sales.parquet' WHERE region = 'PT'")
Sem criar tabelas, sem schema definido, sem CREATE DATABASE. Apontas ao ficheiro e ele faz a query.
Arquitetura: Columnar + Vectorizado
O que faz o DuckDB ser tão rápido para análises são duas decisões de arquitetura:
1. Armazenamento columnar: Em vez de guardar os dados fila a fila (como SQLite ou PostgreSQL), guarda coluna a coluna. Isto significa que uma query que só precisa de 2 colunas de uma tabela com 50 colunas só lê esses 2 ficheiros. O resto fica quieto no disco.
2. Execução vectorizada: Em vez de processar uma linha de cada vez (row-by-row), processa batches de centenas ou milhares de linhas em cada operação. Isto reduz o overhead de CPU e aproveita melhor as caches do processador.
O resultado prático? Queries analíticas que demoram minutos no SQLite ou PostgreSQL resolvem-se em segundos no DuckDB.
Como Funciona na Prática
O DuckDB lê dados de várias fontes sem os importar:
# CSV
duckdb.sql("SELECT * FROM 'vendas.csv' LIMIT 10")
# JSON
duckdb.sql("SELECT * FROM 'logs.json' WHERE status = 500")
# Parquet (o formato preferido)
duckdb.sql("""
SELECT ano, mes, sum(receita)
FROM 'analytics/*.parquet'
GROUP BY ano, mes
ORDER BY ano DESC, mes DESC
""")
Podes também criar tabelas internas quando precisas de performance máxima:
duckdb.sql("""
CREATE TABLE vendas AS
SELECT * FROM 'vendas_2024.csv'
""")
E as extensões permitem ligar diretamente a outras bases de dados:
INSTALL postgres;
LOAD postgres;
ATTACH 'dbname=prod' AS prod (TYPE postgres);
SELECT * FROM prod.clientes
WHERE total_compras > 1000;
Vantagens Principais
1. Performance OLAP Brutal
O motor columnar + vectorizado dá ao DuckDB uma vantagem de 10x a 100x em queries agregadas face a bases de dados row-based. Testes oficiais mostram que o DuckDB mantém a mesma performance mesmo quando o número de colunas aumenta — algo que parte o SQLite e o PostgreSQL.
2. Query Direta a Ficheiros
Esta é, para mim, a killer feature. Não tens de importar dados para fazer análises. Apontas ao ficheiro e fazes SQL. Funciona com CSV, Parquet, JSON, Excel e mais.
duckdb.sql("SELECT * FROM 'data.csv' LIMIT 10")
3. Processa Datasets Gigantes
O DuckDB lida com datasets que cabem em RAM, mas também com os que não cabem. Quando os dados excedem a memória disponível, começa a usar disco de forma transparente. Já processei ficheiros Parquet com dezenas de GBs num portátil com 8 GB de RAM sem problemas.
4. Extensões Ricas
O ecossistema de extensões é impressionante:
| Extensão | Função |
|---|---|
parquet |
Leitura/escrita de Parquet |
json |
Query direta a JSON |
httpfs |
S3, Cloudflare R2, HTTP |
postgres |
Attach a PostgreSQL |
mysql |
Attach a MySQL |
sqlite |
Attach a SQLite |
iceberg |
Apache Iceberg |
delta |
Delta Lake |
excel |
Ficheiros Excel |
fts |
Full-text search |
Carregamento automático — usas a função e a extensão é instalada sozinha.
5. Gratuito e Open Source
Licença MIT. Sem versões enterprise. Sem limites artificiais. Código no GitHub, comunidade ativa.
Desvantagens e Limitações
Não é justo comparar o DuckDB com PostgreSQL ou SQLite sem falar do que ele não faz bem.
1. Concorrência Muito Limitada
A maior limitação: apenas um processo pode escrever de cada vez. Se tentares abrir duas conexões a escrever ao mesmo tempo, a segunda falha. Vários processos podem ler em simultâneo em modo read-only.
Isto desqualifica o DuckDB para qualquer aplicação web com múltiplos utilizadores.
2. Não é OLTP
Transações curtas, inserts individuais, updates pontuais — não é para isso que o DuckDB foi feito. O motor espera operações em massa. Fazer INSERT INTO linha a linha é o pior caso de uso.
3. Sem Cliente-Servidor Nativo
O DuckDB é embutido. Não há serviço para ligar, não há portas, não há autenticação nativa. Para cenários que precisam de acesso remoto, há o Quack mas é uma extensão recente e ainda em desenvolvimento.
4. Consumo de Memória em Queries Complexas
Queries com muitos joins ou agregações pesadas podem consumir bastante RAM. Não é um problema para a maioria dos casos, mas em servidores com pouca memória pode ser limitante.
Comparação com Outras Bases de Dados
| Característica | DuckDB | SQLite | PostgreSQL |
|---|---|---|---|
| Tipo | OLAP (analítico) | OLTP (transacional) | OLTP + OLAP |
| Storage | Columnar | Row-based | Row-based |
| Execução | Vectorizado | Linha a linha | Linha a linha |
| Embutido | ✅ Sim | ✅ Sim | ❌ Cliente-servidor |
| Concorrência escrita | 1 processo | Vários readers (WAL) | Vários writers |
| Query ficheiros | CSV, Parquet, JSON, Excel | ❌ | ❌ (só FDW) |
| Ideal para | Análise dados, ETL | Apps mobile/desktop | Backend web |
| Setup | pip install |
pip install |
Servidor + config |
| Performance agregados | ⚡ Muito rápido | 🐢 Lento | 🐢 Lento |
vs SQLite: O SQLite é rei para apps mobile e desktops que precisam de guardar estado. É transacional, fiável, e aguenta concurrencia de leitura. O DuckDB ganha em análises e processamento de dados, mas perde em cenários transacionais.
vs Pandas: O Pandas é ótimo para datasets que cabem em RAM. Para datasets maiores, o DuckDB é melhor — faz lazy loading, usa disco quando precisa, e a sintaxe SQL é mais natural para agregações complexas.
vs ClickHouse: O ClickHouse é servidor-based, mais escalável para clusters, mas muito mais pesado de configurar. O DuckDB é mais leve, embutido, e ideal para análise local ou em pipelines.
Casos de Uso Ideais
Depois de usar DuckDB em produção e em projetos pessoais, estes são os cenários onde ele brilha:
Data Science e Jupyter Notebooks
Substitui o Pandas quando os datasets são grandes demais para caber em RAM. A API do DuckDB para Python é limpa e funciona bem com DataFrames.
import duckdb
import pandas as pd
df = pd.read_csv("vendas.csv")
duckdb.sql("SELECT regiao, sum(valor) FROM df GROUP BY regiao ORDER BY 2 DESC")
ETL Pipelines
Ler CSV, limpar, transformar, escrever Parquet. Tudo em DuckDB, sem dependências externas.
duckdb.sql("""
COPY (
SELECT
* EXCLUDE (temp_col),
regexp_replace(telefone, '[^0-9]', '', 'g') AS telefone_limpo
FROM 'raw/clientes.csv'
WHERE email IS NOT NULL
) TO 'clean/clientes.parquet' (FORMAT PARQUET)
""")
Data Lakes e Cloud
Query direta a ficheiros Parquet no S3 ou Cloudflare R2, sem os mover.
duckdb.sql("""
SELECT *
FROM 's3://meu-bucket/analytics/*.parquet'
WHERE data >= '2025-01-01'
""")
Análise Rápida de Logs e Exports
Recebes um dump de base de dados, uns logs em JSON, ou um export CSV? Aponta o DuckDB e faz SQL. Sem setup, sem schema, sem esperar.
Quando NÃO Usar DuckDB
- Web apps com muitos utilizadores — Usa PostgreSQL, MariaDB ou SQLite.
- Sistemas transacionais — Compras, inventário, autenticação (OLTP).
- Aplicações com inserts frequentes e concorrentes — DuckDB otimiza para bulk insert, não para
INSERT INTOindividuais. - Precisas de acesso remoto nativo — Considera PostgreSQL ou um servidor ClickHouse.
Conclusão
O DuckDB não veio substituir o PostgreSQL ou o SQLite. Veio preencher um espaço que estava vazio: uma base de dados analítica, embutida, rápida, e zero-config.
Para análise de dados, ETL, e processamento de ficheiros, é difícil bater a combinação de performance + simplicidade. Se trabalhas com dados — mesmo que não sejas engenheiro de dados — experimenta. Instala com pip install duckdb e começa a fazer SQL a ficheiros que tens no disco.
Há uma razão para estar a crescer tão rápido na comunidade data engineering: resolve problemas reais sem complicar.
Comentários (0)
Nenhum comentário ainda. Seja o primeiro!
Deixar comentário