Pipelines de dados do Nota Carioca
Carga BigQuery → Oracle de 31 a 33 vezes mais rápida, em produção poucos dias depois do primeiro teste.
Meu papel
Fiz o PoC sozinho, levei para produção no Prefect e escrevi o plano de saída do Oracle.
- 33x
- mais rápida que o insert convencional
- 35 s
- para 3,4 milhões de linhas
- 0
- divergências na validação de paridade
Problema
Durante uma crise de desempenho no banco do Nota Carioca, sistema de nota fiscal de serviço da cidade, era preciso tirar processamento pesado do Oracle e devolver os dados prontos. A carga pelo conector JDBC levava horas.
Solução
Troquei o caminho todo: bq extract para o GCS, named pipes e SQL*Loader em direct path, que escreve blocos direto nos datafiles. Depois virou um conjunto de flows no Prefect: extração Oracle → BigQuery, transformação em dbt e carga de volta.
Destaques
- Carga completa sem indisponibilidade, com tabelas A/B e troca de sinônimos no fim.
- Tratamento dos casos que quebravam a carga, como quebra de linha dentro de campo, branco que virava NULL e tamanho de coluna.
- Paridade conferida em 300 métricas agregadas e em mais de 3 mil linhas comparadas célula a célula.
- Bot de Discord para disparar e acompanhar as cargas de produção, com exclusão mútua entre elas.
- Plano de arquitetura para tirar essa trilha do Oracle de vez, com ingestão direta da API nacional, BigQuery, PostgreSQL e uma API em Go.
Resultado
No PoC, 3,4 milhões de linhas entraram em 35 s (de 87 mil a 121 mil linhas/s), contra cerca de 17 minutos em insert convencional. O pipeline roda em produção duas vezes por dia.