Retour à l'accueil

DuckDB comme stockage : remplacer ETL Postgres

DuckDB implémente un stockage analytique compact dans un seul fichier, remplaçant ETL + Postgres pour les tâches OLAP. Décrit l'architecture, les scripts de mise à jour, SLA et limitations. Convient aux développeurs pour l'analyse de produits avec des données Parquet.

DuckDB : micro-stockage au lieu du chaos ETL
Advertisement 728x90

DuckDB comme entrepôt analytique compact : adieu ETL et Postgres

DuckDB permet de créer un entrepôt analytique dans un simple fichier .duckdb, en évitant les pipelines ETL et Postgres pour les charges OLAP. Le moteur traite directement les fichiers Parquet, CSV et JSON locaux ou sur S3/GCS, offrant un accès rapide aux données pour tableaux de bord et rapports, sans infrastructure distribuée. Idéal pour les équipes aux ressources limitées qui privilégient la fraîcheur et la reproductibilité des données.

Les points douloureux de la pile ETL + Postgres traditionnelle

Postgres gère bien les charges OLTP, mais les requêtes OLAP génèrent des problèmes en cascade : les index ralentissent le vacuuming, les agrégats interfèrent avec les transactions, et les jobs ETL se heurtent aux changements de schéma. Les équipes passent plus de temps en tâches administratives qu'en analyse. DuckDB élimine ces points de défaillance en tant que moteur OLAP embarqué sans stockage persistant.

L'architecture se simplifie ainsi :

Google AdInline article slot
  • Sources (bases, S3, CSV) → Instantanés Parquet → DuckDB (couches bronze/argent/or) → Exports BI.

Le pipeline se résume à un script planifié avec vues et exports, minimisant les frais d'exploitation.

SLAs pour un micro-entrepôt DuckDB

Vous pouvez garantir des SLAs clairs sans complexité de cluster :

  • Fraîcheur des données : Mises à jour toutes les 15–60 minutes avec journalisation des horodatages.
  • Précision : Métriques dans des vues SQL sous contrôle de version avec revue de code.
  • Performance : p95 < 2 s pour tableaux de bord sur 90 jours de données.
  • Récupération : Rebuild complet depuis Parquet en <30 minutes.
  • Exploitation/Coût : Un fichier + un job, sans coûts de stockage continu.

Le fichier .duckdb est facile à sauvegarder et à déplacer.

Google AdInline article slot

Cas d'usage en analyse produit

Pour un SaaS B2B avec événements en base relationnelle et logs sur S3 :

  • Instantanés quotidiens des tables vers Parquet partitionné.
  • Événements sous forme de fichiers Parquet partitionnés par date.
  • Vues de métriques en couche or (WAU, cohortes de rétention).
  • Export de Parquet curaté pour outils BI.

L'extension httpfs permet la lecture directe sur S3 sans copies locales. DuckDB agrège plusieurs fichiers Parquet comme une seule table.

Scripts d'implémentation pratiques

Script de mise à jour (Python)

import duckdb
from datetime import datetime

DB = "micro_warehouse.duckdb"

con = duckdb.connect(DB)
con.execute("INSTALL httpfs;")
con.execute("LOAD httpfs;")

con.execute("""
CREATE OR REPLACE VIEW bronze_events AS
SELECT *
FROM read_parquet('data/events/date=*/events-*.parquet');
""")

con.execute("""
CREATE OR REPLACE VIEW silver_events AS
SELECT
  CAST(event_time AS TIMESTAMP) AS event_time,
  user_id,
  team_id,
  event_name,
  NULLIF(properties, '') AS properties
FROM bronze_events
WHERE user_id IS NOT NULL;
""")

con.execute("""
CREATE OR REPLACE VIEW gold_weekly_active_teams AS
SELECT
  date_trunc('week', event_time) AS week,
  COUNT(DISTINCT team_id) AS weekly_active_teams
FROM silver_events
GROUP BY 1
ORDER BY 1;
""")

con.execute("""
COPY (SELECT * FROM gold_weekly_active_teams)
TO 'exports/gold_weekly_active_teams.parquet' (FORMAT PARQUET);
""")

con.execute("CREATE OR REPLACE TABLE ops_refresh_log AS SELECT 1 AS dummy;")
con.execute("""
INSERT INTO ops_refresh_log
SELECT 1
""")

print("Update OK:", datetime.utcnow().isoformat(), "DB:", DB)

Ce script construit les couches bronze/argent/or et exporte les métriques.

Google AdInline article slot

Mises à jour incrémentales

Pour les upserts, utilisez MERGE sur les clés (semaine, team_id) dans une table matérialisée, en recalculant les fenêtres glissantes.

Migration sans interruption

Gardez l'OLTP sur Postgres et migrez l'OLAP vers DuckDB via l'extension postgres_scanner pour un accès lecture/écriture sur une instance live. Transférez progressivement les requêtes sans refactoring.

Limites de DuckDB comme entrepôt

Parfait pour :

  • Quelques analystes (tableaux de bord, exports).
  • Données append-only ou instantanés.
  • Flux Parquet portables.

Pas adapté pour :

  • Forte concurrence avec utilisateurs interactifs.
  • Écritures OLTP avec garanties ACID.
  • Sécurité au niveau des lignes multi-locataires.
  • Contrats de données d'entreprise avec de nombreux producteurs.

Points clés

  • DuckDB est un moteur OLAP embarqué en un seul fichier, lisant directement Parquet/S3.
  • Simplifie la pile : script + vues au lieu d'ETL + Postgres.
  • SLAs atteignables : fraîcheur 15 min, p95<2 s, récupération <30 min.
  • Migration progressive via postgres_scanner.
  • Limites : faible concurrence, pas pour OLTP.

— Editorial Team

Advertisement 728x90

Lire ensuite