AngoraTek EN
← Retour au blog
Tutoriels 9 min de lecture

La planète entière d'Overture répond à COUNT(*) en 0,37 seconde

81 455 423 lieux sont revenus en 0,37 seconde. La question portait sur l'intégralité de la version places de la publication 2026-09-23.1 d'Overture Maps, posée en GeoParquet dans un bucket S3 que personne chez AngoraTek n'opère. Pas un seul enregistrement de lieu n'a traversé le réseau pour y répondre. DuckDB a lu les pieds de fichier Parquet, additionné les comptes de lignes notés dans les métadonnées, puis s'est arrêté.

Accueillez ce minutage comme une curiosité avec un mécanisme, pas comme un argument de vente. L'affirmation que ce billet défend avec des mesures est plus ordinaire et plus utile. Pour du travail régional, vous n'avez pas besoin d'un pipeline de téléchargement pour Overture : DuckDB élague la planète avec un prédicat de boîte englobante avant de toucher une seule géométrie. Ce qu'il reste du script d'extraction tient en une instruction COPY. Nous allons faire tourner un exemple de bout en bout, une extraction régionale autour du lac Tahoe. Chaque nombre ci-dessous a été mesuré le 2026-10-11 avec DuckDB 1.5.6 en local, contre la publication 2026-09-23.1, pour que vous puissiez reproduire le tout.

La mise en place tient en quatre lignes et un identifiant de version

Overture publie chaque version en GeoParquet sous un préfixe S3 unique, dans des dossiers de style hive tels que theme=places/type=place/*.parquet. Les noms de dossiers agissent comme de vraies colonnes dès que DuckDB est informé de leur existence, et c'est le travail de hive_partitioning. Deux extensions et l'affaire est en marche :

INSTALL spatial;
INSTALL httpfs;
LOAD spatial;
LOAD httpfs;

httpfs donne à DuckDB son lecteur S3. spatial installe les types géométriques et les prédicats que voudra la dernière étape du flux. Overture livre un nouvel identifiant de version chaque mois, épinglez donc dans le chemin celui contre lequel vous testez plutôt que de coller la dernière née de la semaine. Sans cela, les comptes changent sous vos pieds. La documentation d'Overture propose un guide DuckDB officiel et un atelier sur labs.overturemaps.org. Rien dans cet article n'exige plus que les quatre lignes ci-dessus.

Le comptage de 0,37 seconde ne lit aucun enregistrement de lieu

Un comptage sans filtre n'exerce que les métadonnées Parquet :

SELECT count(*) AS places_on_the_planet
FROM read_parquet(
    's3://overturemaps-us-west-2/release/2026-09-23.1/theme=places/type=place/*.parquet',
    hive_partitioning = 1
);

DuckDB va chercher le pied de chaque fichier, y lit les comptes de lignes qui y sont consignés, et additionne. Le réseau transporte des pieds plutôt que des lignes, voilà pourquoi 81 millions de lieux coûtent moins d'une seconde. Je traite désormais ce comptage sans prédicat comme un contrôle de joignabilité plutôt que comme un résultat : il prouve que le bucket, l'identifiant de version et le partitionnement s'alignent avant toute requête coûteuse. Il a gardé ce rôle dans le flux Tahoe, lancé une fois, au début, comme test de fumée.

Lisez les 0,37 seconde pour ce qu'ils sont. Une arithmétique de métadonnées. Ne les citez jamais comme la vitesse d'interrogation d'Overture.

Seule la boîte englobante élague

Chaque entité d'Overture embarque une structure bbox, de xmin à ymax. Un prédicat sur cette structure élague au niveau propre de Parquet : les groupes de lignes dont les statistiques placent leurs boîtes hors de votre région sont sautés entiers, sans qu'une seule géométrie soit désérialisée. Les statistiques résident dans les métadonnées de fichier que DuckDB sait déjà lire, donc la vérification coûte une comparaison plutôt qu'un téléchargement. Chaque minutage de cet article repose sur ce mécanisme.

Notre première version du filtre Tahoe sautait la boîte et passait immédiatement au spatial, ST_Contains contre un polygone du lac. C'était le prédicat plus correct et le plus mauvais plan : un prédicat géométrique doit tirer et reconstruire chaque géométrie candidate, donc il n'élague rien sur le disque et paie la lecture complète. Le prédicat de bbox fait l'élagage, et la géométrie peut ensuite s'appliquer aux survivants :

SELECT count(*) AS places_in_tahoe_bbox
FROM read_parquet(
    's3://overturemaps-us-west-2/release/2026-09-23.1/theme=places/type=place/*.parquet',
    hive_partitioning = 1
)
WHERE bbox.xmin >= -121.0 AND bbox.xmax <= -119.6
  AND bbox.ymin >=  38.7 AND bbox.ymax <=  39.5;

Des opérateurs de comparaison, pas des fonctions spatiales : ce comptage retient les lieux entièrement contenus dans la boîte. Il a renvoyé 28 166 lieux en 2,77 secondes sur une connexion chaude. Là où votre frontière n'est pas un rectangle, la parade est en deux étapes : prédicat de bbox d'abord pour élager, puis ST_Intersects sur les survivants pour être exact. La première étape fixe l'addition que la seconde paie.

Les comptages chiffrent le prix de l'extraction

Compter chaque thème avant toute copie, c'est la façon d'apprendre ce que coûtera l'extraction. Le même prédicat de bbox sur le thème buildings, theme=buildings/type=building, a renvoyé 228 935 bâtiments en 37,1 secondes. Sur les segments de transport, theme=transportation/type=segment, il a renvoyé 106 242 segments en 18,0 secondes. Tout ce qui a été mesuré pour cet article, connexion chaude, même portable, publication 2026-09-23.1, tient dans un tableau :

RequêteRésultatTemps réel
Places, planète entière, sans filtre81 455 4230,37s
Places, boîte Tahoe28 1662,77s
Bâtiments, boîte Tahoe228 93537,1s
Segments de transport, boîte Tahoe106 24218,0s
Le nombre des bâtiments mérite sa note d'honnêteté. L'élagage de bbox est identique dans sa forme au comptage places, et le temps diffère d'un facteur treize. Je n'ai pas disséqué quels groupes de lignes portaient la masse en plus, et je n'inventerai pas la cause ; ce que le nombre établit, c'est l'amplitude. Les places ont répondu en moins de trois secondes, les bâtiments ont pris un peu plus d'une demi-minute. Cet écart est ce que vous emportez dans toute conversation où quelqu'un suppose que tous les thèmes d'Overture se comportent pareil.

Mettez le tableau devant une vraie réunion et il en change la tenue. Votre municipalité demande sa couche de bâtiments en GeoJSON, et quelqu'un propose d'écrire un script qui télécharge tout le thème buildings d'Overture, parce que le fichier sera gros. Compter d'abord : 228 935 bâtiments dans la boîte Tahoe, comptés en 37,1 secondes. Le comptage mesuré transforme un méga-téléchargement vaguement menaçant en extraction bornée, et il le fait avec un nombre que chacun dans la salle peut relancer soi-même.

Une extraction que personne ne réinterrogera ne vaut pas sa largeur de bande. Les comptages ci-dessus disaient que les jeux Tahoe étaient assez petits pour être copiés en un seul passage de bbox par thème, alors nous l'avons fait. La publication 2026-09-23.1 livre places au schéma v2.0.0, où l'ancien champ categories est devenu basic_category plus le taxonomy plus riche, et la requête sélectionne les deux :

COPY (
    SELECT id, geometry, confidence,
           names.primary AS name,
           basic_category,
           taxonomy.primary AS category_primary,
           bbox
    FROM read_parquet(
        's3://overturemaps-us-west-2/release/2026-09-23.1/theme=places/type=place/*.parquet',
        hive_partitioning = 1
    )
    WHERE bbox.xmin >= -121.0 AND bbox.xmax <= -119.6
      AND bbox.ymin >=  38.7 AND bbox.ymax <=  39.5
) TO 'tahoe-places-2026-09-23.1.parquet' (FORMAT PARQUET);

À partir de là, les questions tournent contre le fichier local :

SELECT name, confidence, category_primary
FROM 'tahoe-places-2026-09-23.1.parquet'
WHERE category_primary = 'furniture_store';

Ashley Store, un commerce de meubles porté avec la confiance 1,0, est dans ces lignes, avec l'identifiant e13e7209-a09a-4cf7-9d45-0532936fcc4c si vous voulez vérifier l'enregistrement vous-même. Les questions de qualité de données deviennent bon marché ici aussi. Compter les lieux sans catégorie principale tient en une ligne contre la copie :

SELECT count(*) AS places_without_primary_category
FROM 'tahoe-places-2026-09-23.1.parquet'
WHERE category_primary IS NULL;

896 des 28 166 lieux Tahoe, soit 3,2 pour cent, revenaient sans taxonomy.primary du tout. Ce trou honnête dans les données sources, ce genre de sonde d'une ligne le fait remonter sans autre aller-retour au bucket. Cette boucle, c'est ce que l'extraction rapporte : chaque passage contre S3 remet la taxe réseau en marche, tandis que les copies locales répondent sans bucket dans la boucle.

Ce que cette recette ne fera pas

Quatre limites, chacune avec sa parade.

Les premières lectures sont lentes. Le temps de 2,77 secondes vient d'une connexion chaude. Un premier passage sur ce bucket va chercher les pieds de Parquet par la voie de S3GetObject un fichier à la fois, la latence domine, et le cache httpfs de DuckDB ne sert qu'après le premier contact. Attendez-vous à ce que la course initiale de chacune de ces requêtes coûte plusieurs fois son temps à chaud. Gardez un fichier de base DuckDB persistant pour que caches et copies survivent à la session CLI, et faites le travail répété contre l'extraction locale.

Le comptage planétaire de 0,37 seconde n'est pas une revendication de débit. C'est une somme de valeurs de pied de fichier. Quiconque le cite comme preuve qu'Overture répond aux questions planétaires en moins d'une seconde cite l'emballage, pas les données.

Seule bbox élague. L'échec du polygone de lac plus haut est la règle générale, pas l'exception : aucun prédicat géométrique n'élague le Parquet. Une région définie par un polygone quelconque paie toujours le prix en deux étapes, budgétisez-le avant de promettre la latence de cette étape.

DuckDB est un moteur analytique, pas une base de service. Les nombres ci-dessus sont des minutages analytiques en session unique, et aucun d'eux ne fait de DuckDB le socle spatial d'une API qui sert des cartes à de vrais utilisateurs. PostGIS et les magasins documentaires sont là où cette conversation a lieu. Nous reprenons le choix du stockage dans le billet qui suit sur la destination d'une extraction Overture, à part de la recette d'interrogation en place décrite ici.

La décision tient en une phrase : si votre région d'intérêt tient dans une boîte englobante, interrogez Overture en place et comptez avant de copier. Gardez l'extraction pour ce que vous demanderez plus d'une fois. Si vous avez besoin de la planète entière, ou d'une latence de service, le script de téléchargement et la base reviennent sur la table. 81 455 423 lieux sont déjà assis dans le bucket, taillés à 28 166 par une clause WHERE. La planète est une table. La plupart des projets n'en ont besoin que de quelques boîtes.

AngoraTek travaille avec Overture et le reste de la pile de géodonnées ouvertes. [Écrivez-nous](/fr/#contact) quand votre question de données cartographiques a dépassé le script de téléchargement.

Merci d'avoir lu jusqu'ici. Si cela ressemble au problème sur lequel vous butez, parlez-nous-en. Un fondateur lit chaque message.

Engager la conversation