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 INTO individuais.
  • 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.

Recursos

Comentários (0)

Nenhum comentário ainda. Seja o primeiro!

Deixar comentário