Skip to main content
Aller au contenu principal

Comparaison des performances

Choisissez le backend optimal pour la taille de votre jeu de données et vos exigences de performance. Ce guide fournit des benchmarks détaillés et des recommandations pour vous aider à prendre des décisions éclairées.

Recommandation rapide
  • < 10k entités : N'importe quel backend fonctionne bien
  • 10k - 50k entités : Spatialite optimal, PostgreSQL si disponible
  • 50k - 500k entités : PostgreSQL recommandé (5-10x plus rapide)
  • > 500k entités : PostgreSQL requis

Performance par taille de jeu de données

Matrice de décision visuelle

Résultats des benchmarks

Environnement de test

Tous les benchmarks réalisés sur :

  • CPU : Intel Core i7-10700K (8 cœurs, 3.8GHz)
  • RAM : 16GB DDR4
  • Stockage : SSD NVMe (Samsung 970 EVO)
  • OS : Ubuntu 22.04 LTS
  • QGIS : 3.34 LTR
  • PostgreSQL : 14.10 avec PostGIS 3.3
  • Python : 3.10

Résumé global des performances

Taille du jeuPostgreSQLSpatialiteOGR (GeoPackage)OGR (Shapefile)Recommandation
< 10k0.5s ⚡0.5s ⚡0.8s ⚡1.2s ⚡N'importe quel backend
10k - 50k1.2s ⚡2.1s ⚡5.3s 🐌8.7s 🐌Spatialite
50k - 100k2.1s ⚡8.5s 🐌15.2s 🐌25.1s 🐌PostgreSQL
100k - 500k8.4s ⚡65s 🐌108s 🐌187s 🐌PostgreSQL
> 500k45s ⚡Timeout ❌Timeout ❌Timeout ❌PostgreSQL uniquement

Légende :

  • ⚡ Excellent (< 10s)
  • 🐌 Lent (> 10s)
  • ❌ Non viable (timeout/crash)

Benchmarks détaillés par opération

Requête Intersects simple

Jeu de données : 100 000 entités polygones
Filtre : 1 000 entités
Opération : ST_Intersects(geometry, filter_geometry)

BackendTemps d'exécutionEntités retournéesUsage mémoire
PostgreSQL2.1s8 34745 MB
Spatialite8.5s8 347128 MB
OGR (GeoPackage)15.2s8 347512 MB
OGR (Shapefile)25.1s8 347712 MB

Analyse :

  • PostgreSQL est 4x plus rapide que Spatialite
  • PostgreSQL est 7x plus rapide que OGR GeoPackage
  • PostgreSQL utilise 11x moins de mémoire que OGR Shapefile

Buffer + Intersects

Jeu de données : 50 000 entités lignes
Buffer : 100 mètres
Opération : ST_Intersects(geometry, ST_Buffer(filter_geometry, 100))

BackendTemps bufferTemps intersectTemps totalAccélération
PostgreSQL0.3s0.9s1.2s7x
Spatialite1.2s6.5s7.7s1.1x
OGR (GeoPackage)3.1s5.2s8.3s1x (référence)
OGR (Shapefile)4.7s8.9s13.6s0.6x

Analyse :

  • Le buffer côté serveur PostgreSQL est 10x plus rapide que côté client
  • Spatialite égale OGR pour les petits buffers
  • Le format Shapefile ajoute une surcharge significative

Expression complexe

Jeu de données : 200 000 entités points
Expression : ST_Intersects() AND distance < 500 AND area > 1000

BackendPlanificationExécutionTotalUsage index
PostgreSQL0.2s3.1s3.3s✅ GIST + B-tree
Spatialite-18.3s18.3s✅ R-tree
OGR (GeoPackage)-45.7s45.7s✅ R-tree
OGR (Shapefile)-123s123s⚠️ .qix uniquement

Analyse :

  • Le planificateur PostgreSQL optimise les requêtes multi-conditions
  • Index spatial + attribut combinés uniquement dans PostgreSQL
  • Les backends OGR doivent évaluer toutes les conditions séquentiellement

Scénarios réels

Scénario 1 : Urbanisme (Parcelles)

Données : 75 000 parcelles cadastrales
Tâche : Trouver toutes les parcelles intersectant une zone de développement proposée
Filtre : 15 polygones complexes

BackendChargement initialApplication filtreRafraîchissementExpérience utilisateur
PostgreSQL0.8s1.5s0.3s⚡ Instantané
Spatialite1.2s12.1s11.8s🐌 Délai perceptible
OGR (GeoPackage)2.3s23.4s22.9s🐌 Attente significative

Recommandation : PostgreSQL pour usage professionnel

Scénario 2 : Analyse environnementale (Points)

Données : 15 000 points de mesure
Tâche : Trouver les points dans un rayon de 200m des sites contaminés
Filtre : 50 localisations de points avec buffer de 200m

BackendCréation bufferRequête spatialeTotalRecommandation
PostgreSQL0.1s0.4s0.5s✅ Excellent
Spatialite0.3s1.8s2.1s✅ Bon
OGR (GeoPackage)0.8s4.2s5.0s⚠️ Acceptable

Recommandation : Spatialite suffisant pour cette taille

Scénario 3 : Réseau d'infrastructure (Lignes)

Données : 350 000 segments routiers
Tâche : Trouver toutes les routes traversant des zones inondables
Filtre : 500 polygones d'inondation

BackendRésultatNotes
PostgreSQL15.2s ⚡Excellent, utilisable
Spatialite187s 🐌Très lent, pas pratique
OGRTimeout ❌Non viable

Recommandation : PostgreSQL requis

Facteurs de performance

1. Impact de la taille du jeu de données

PostgreSQL évolue linéairement avec d'excellentes performances :

Entités :     10k    50k    100k   500k   1M     5M
Temps : 0.5s 1.2s 2.1s 8.4s 45s 180s
Par entité : 50μs 24μs 21μs 17μs 45μs 36μs

Spatialite performance se dégrade avec la taille :

Entités :     10k    50k    100k   500k   1M
Temps : 0.5s 2.1s 8.5s 65s Timeout
Par entité : 50μs 42μs 85μs 130μs -

OGR sévèrement limité par la taille :

Entités :     10k    50k    100k   500k
Temps : 0.8s 5.3s 15.2s Timeout
Par entité : 80μs 106μs 152μs -

2. Impact de l'index spatial

Avec index spatial :

BackendType d'index100k entitésAccélération
PostgreSQLGIST2.1s100x
SpatialiteR-tree8.5s50x
OGR (GeoPackage)R-tree15.2s30x
OGR (Shapefile).qix25.1s15x

Sans index spatial :

Backend100k entitésvs indexé
PostgreSQL210s100x plus lent ❌
Spatialite425s50x plus lent ❌
OGR (GeoPackage)456s30x plus lent ❌
OGR (Shapefile)376s15x plus lent ❌
Critique

Assurez-vous toujours que les index spatiaux existent ! Ils apportent une amélioration de performance de 15-100x.

3. Complexité géométrique

Géométries simples (Points, polygones simples) :

Backend100k simples100k complexesRatio
PostgreSQL2.1s3.8s1.8x
Spatialite8.5s18.2s2.1x
OGR15.2s41.7s2.7x

Géométries complexes (Multi-parties, beaucoup de vertices) :

  • Augmentent le temps de traitement de 2-3x
  • Impact plus prononcé sur le backend OGR
  • PostgreSQL gère le mieux la complexité

4. Opérations concurrentes

5 filtres simultanés :

BackendSéquentielConcurrentAccélération
PostgreSQL10.5s3.2s3.3x plus rapide ✅
Spatialite42.5s38.1s1.1x plus rapide
OGR76s91s1.2x plus lent ❌

Analyse :

  • PostgreSQL excelle dans les opérations concurrentes
  • Spatialite gère la concurrence de manière acceptable
  • OGR souffre de la contention des couches en mémoire

Comparaison de l'usage mémoire

Consommation mémoire maximale

Jeu de données : 100 000 entités

BackendChargementFiltrageTotal maxEfficacité
PostgreSQL25 MB20 MB45 MB⚡ Excellent
Spatialite45 MB83 MB128 MB✅ Bon
OGR (Mémoire)156 MB356 MB512 MB⚠️ Élevé
OGR (Shapefile)178 MB534 MB712 MB❌ Très élevé

Évolution de la mémoire

PostgreSQL (MB par 100k entités) :

100k → 45 MB
500k → 127 MB
1M → 234 MB
5M → 1.1 GB

Spatialite (MB par 100k entités) :

100k → 128 MB
500k → 612 MB
1M → 1.4 GB (risque de crash)

OGR (MB par 100k entités) :

100k → 512 MB
500k → 3.2 GB (crash probable)

Performance réseau (PostgreSQL)

Base de données locale vs distante

Jeu de données : 100 000 entités

ConnexionTemps requêteTransfert donnéesTotalvs local
Local (localhost)2.1s-2.1s1x
LAN (1 Gbps)2.3s0.2s2.5s1.2x
WAN (100 Mbps)2.4s1.8s4.2s2x
Distant (10 Mbps)2.5s18.3s20.8s10x

Recommandations :

  • PostgreSQL local : Meilleures performances
  • Connexion LAN : Impact minimal
  • WAN/Distant : Envisagez l'optimisation VPN ou la synchronisation de données

Analyse coût-bénéfice

Investissement temps de configuration

BackendConfig. initialeCourbe d'apprentissageMaintenanceIdéal pour
PostgreSQL30-60 minModéréeFaibleGrands jeux, production
Spatialite0 minFacileAucuneJeux petits-moyens
OGR0 minTrès facileAucuneTests, prototypes

ROI de performance

Pour 100k entités, 10 opérations/jour :

BackendTemps perdu/jourSemaineMoisAnnée
PostgreSQL21s2.5 min11 min2.2 heures
Spatialite85s10 min42 min8.5 heures
OGR152s18 min76 min15.2 heures

PostgreSQL économise :

  • 1 minute vs Spatialite par opération
  • 2 minutes vs OGR par opération
  • 13 heures par an pour une utilisation typique
L'investissement en vaut-il la peine ?

Si vous filtrez plus de 100k entités plus d'une fois par semaine, le temps de configuration PostgreSQL est rentabilisé en 1 mois.

Matrice de décision

Choisir PostgreSQL quand

✅ Jeu de données > 50 000 entités
✅ Besoin des meilleures performances
✅ Infrastructure serveur disponible
✅ Utilisateurs concurrents
✅ Usage professionnel/production
✅ Opérations spatiales complexes
✅ Filtrage fréquent (> 5 fois/jour)

Choisir Spatialite quand

✅ Jeu de données 10 000 - 50 000 entités
✅ Pas de serveur de base de données disponible
✅ Solution portable nécessaire
✅ Configuration rapide requise
✅ Utilisateur unique
✅ Filtrage occasionnel (< 5 fois/jour)
✅ Usage bureau/portable

Choisir OGR quand

✅ Jeu de données < 10 000 entités
✅ Compatibilité de format critique
✅ Tests/prototypage
✅ Opérations ponctuelles
✅ Pas de temps de configuration disponible
✅ Filtrage rare (< 1 fois/jour)

Recommandations d'optimisation

Pour une performance maximale

  1. Utilisez PostgreSQL pour les jeux de données > 50k
  2. Assurez-vous que les index spatiaux existent et sont à jour
  3. Exécutez VACUUM ANALYZE régulièrement (PostgreSQL/Spatialite)
  4. Augmentez les tailles de cache dans la configuration de la base de données
  5. Utilisez un stockage SSD pour les bases de données
  6. Optimisez la complexité géométrique si possible
  7. Regroupez les opérations quand plusieurs filtres sont nécessaires

Pour une approche équilibrée

  1. Commencez avec Spatialite pour le prototypage
  2. Migrez vers PostgreSQL quand nécessaire
  3. Créez des index spatiaux toujours
  4. Surveillez les performances avec EXPLAIN
  5. Testez avec des données représentatives avant la production

Dépannage des performances lentes

Liste de vérification des performances

  • L'index spatial existe et est valide
  • Les statistiques de base de données sont à jour (ANALYZE)
  • RAM suffisante disponible
  • Stockage SSD (pas HDD)
  • Connexion réseau rapide (si BD distante)
  • Version QGIS à jour
  • Pas d'autres processus lourds en cours
  • Géométrie pas excessivement complexe

Requêtes de diagnostic

PostgreSQL :

-- Vérifier le plan de requête
EXPLAIN ANALYZE
SELECT * FROM layer WHERE ST_Intersects(geometry, filter_geom);

-- Cherchez "Index Scan using" pas "Seq Scan"

-- Vérifier l'usage des index
SELECT schemaname, tablename, indexname, idx_scan
FROM pg_stat_user_indexes
WHERE tablename = 'ma_couche';

Spatialite :

-- Vérifier si l'index existe
SELECT * FROM geometry_columns WHERE f_table_name = 'ma_couche';

-- Vérifier l'index
SELECT * FROM sqlite_master WHERE type = 'table' AND name LIKE 'idx_%';

Voir aussi


Dernière mise à jour des benchmarks : 14 décembre 2025
Version du plugin : 2.3.0
Jeu de données de test : Données OpenStreetMap, charges de travail SIG typiques