DuckDB : interroger 30 millions d’entreprises dans un fichier distant, en 18 secondes

DuckDB lit un fichier Parquet directement sur data.gouv.fr et ne télécharge que les colonnes utiles : les créations d’entreprises par année, sur 30 millions de lignes, en 18 secondes.

Le répertoire SIRENE, qui recense toutes les entreprises et tous les établissements de France, pèse près de 3 Go en Parquet (les deux fichiers principaux). Quand on veut en tirer quelques chiffres, le réflexe est de télécharger, d'installer une base de données, d'écrire un script d'import, d'attendre, puis seulement d'interroger. Il existe un raccourci que peu de gens connaissent : DuckDB sait lire un fichier Parquet directement sur Internet, et ne télécharge que ce dont la requête a besoin.

Histogramme des créations d'entreprises par année en France de 2000 à 2025, avec la requête DuckDB qui l'a produit

Une requête, un gros fichier distant, 18 secondes #

Le graphique ci-dessus vient d'une seule requête SQL lancée sur un petit conteneur de 2 Go de RAM, contre le fichier des unités légales publié sur data.gouv.fr (714 Mo, plus de 30 millions de lignes) :

INSTALL httpfs; LOAD httpfs;
SET memory_limit='900MB'; SET threads=2;

SELECT year(dateCreationUniteLegale) AS annee,
       count(*) AS n
FROM read_parquet('https://static.data.gouv.fr/…/stock-stockunitelegale-parquet.parquet')
WHERE year(dateCreationUniteLegale) BETWEEN 2000 AND 2025
GROUP BY annee
ORDER BY annee;

Résultat mesuré : 18,7 secondes, sous 900 Mo de mémoire. Et un simple count(*) sur tout le fichier (30 148 401 unités légales) répond en 0,6 seconde, parce que le format Parquet stocke déjà ce total dans ses métadonnées.

Pourquoi ça marche ? #

Parquet est un format en colonnes. La requête ci-dessus ne lit que la colonne des dates de création : les autres colonnes (noms, adresses, activité…) ne sont jamais transférées. DuckDB demande au serveur uniquement les morceaux du fichier utiles, grâce aux requêtes HTTP par plage d'octets, et le serveur de data.gouv.fr les accepte. Aucun import, aucun index, aucune base à maintenir : le fichier distant est la base. Le programme tient dans un seul exécutable. Pas de Python à configurer, pas d'environnement virtuel : sur un conteneur minimal où pip n'était même pas disponible, c'est ce qui a fait la différence.

Ce qu'on y lit : #

Les créations ont plus que triplé depuis 2000 : 378 000 cette année-là, 1,26 million en 2025.

La marche de 2009 (de 514 000 à 682 000, soit un tiers de plus) correspond à l'arrivée du statut d'auto-entrepreneur, devenu micro-entrepreneur : le nombre d'entrepreneurs individuels compte dans ces totaux. Depuis 2021, on est stable autour de 1,2 million de nouvelles unités par an. Attention à la lecture : le fichier contient aussi les entreprises disparues depuis. Ce graphique compte les créations, pas les entreprises encore actives.

En vrai : l'ingestion de la page « Économie locale » #

Nous utilisons cette technique pour la section « Économie locale » des https://xj1.fr/commune/ : à partir du fichier des établissements (2,2 Go), DuckDB calcule, pour chaque commune, le nombre d'établissements, la part d'employeurs, les créations et les cessations par année. Le tout tourne en 5 à 7 minutes sur le même conteneur de 2 Go, avec une limite de mémoire à 1,3 Go.

Trois réglages ont compté :

  • preserve_insertion_order=false, qui évite de garder l'ordre des lignes en mémoire et fait baisser la consommation ;
  • temp_directory, qui permet à DuckDB de déborder sur le disque si une agrégation dépasse la limite ;
  • l'écriture du résultat dans de petits CSV (COPY … TO), que le reste du code charge ensuite normalement.

Limites #

Lire un fichier distant, c'est dépendre du réseau et du serveur : pour interroger souvent le même fichier, mieux vaut en garder une copie locale. Et ce n'est pas un remplacement de PostgreSQL ou SQLite pour un site qui sert des requêtes à des visiteurs : DuckDB est fait pour analyser des données, pas pour répondre à des milliers de petites lectures par seconde.

Pour qui travaille sur l'open data, c'est pourtant un changement de rythme : on passe de « télécharger, importer, attendre » à « poser une question et lire la réponse ». Les jeux de données Parquet de data.gouv.fr sont de plus en plus nombreux. Essayez avec le vôtre : une ligne de commande suffit.

A découvrir ici : https://duckdb.org/ et https://github.com/duckdb/duckdb !

Pour ne rien manquer : le flux RSS du blog.

À lire aussi