🔝 Retour au Sommaire
PostgreSQL est un système de gestion de base de données extrêmement flexible qui peut s'adapter à une grande variété de charges de travail. Cependant, cette flexibilité signifie qu'il n'existe pas de configuration "universelle" optimale. Une configuration idéale pour une application dépend du type de charge de travail qu'elle doit gérer.
Cette annexe présente des configurations de référence prêtes à l'emploi pour les principaux cas d'usage de PostgreSQL. Chaque configuration est expliquée en détail avec :
- Les objectifs et priorités pour ce cas d'usage
- Les paramètres critiques et leurs valeurs recommandées
- Les compromis et décisions de conception
- Des exemples concrets d'application
- Des checklist de vérification
Un cas d'usage (ou workload en anglais) définit le type de charge de travail que votre base de données doit supporter. Il détermine :
- Le type d'opérations : Lectures, écritures, ou les deux ?
- La fréquence : Milliers de requêtes par seconde ou quelques analyses par jour ?
- La complexité : Requêtes simples ou agrégations massives ?
- La latence acceptable : Millisecondes ou minutes ?
- Le volume de données : Gigaoctets ou téraoctets ?
PostgreSQL utilise des ressources limitées (RAM, CPU, disque). Selon votre cas d'usage, vous devez prioriser certains aspects :
| Ressource | OLTP | OLAP | Mixed | Dev Local |
|---|---|---|---|---|
| RAM | Cache données chaudes | Tris et agrégations massifs | Compromis | Économiser pour IDE |
| CPU | Parallélisme limité | Parallélisme maximal | Modéré | Limité (laptop) |
| Disque | Écritures fréquentes (WAL) | Lectures séquentielles massives | Équilibré | Performance > durabilité |
| Latence | Critique (<100ms) | Acceptable (secondes) | Critique pour OLTP | Non critique |
| Débit | Élevé (transactions/sec) | Critique (GB/sec) | Équilibré | Faible |
Exemple concret :
Imaginons un paramètre simple : work_mem (mémoire pour tris et groupements).
-
OLTP :
work_mem = 32 MB- Pourquoi ? Beaucoup de connexions (200-500), peu de mémoire par requête
- Requêtes simples (1-1000 lignes), pas de gros tris
-
OLAP :
work_mem = 1 GB- Pourquoi ? Peu de connexions (20-50), beaucoup de mémoire disponible
- Requêtes complexes (millions de lignes), tris et groupements massifs
-
Mixed :
work_mem = 64 MB(global) avec ajustements par rôle- Pourquoi ? Compromis entre les deux
- Rôles OLTP : 32 MB, Rôles OLAP : 512 MB-1 GB
-
Dev Local :
work_mem = 64 MB- Pourquoi ? Confort de développement, mais économiser RAM pour l'IDE
Une seule valeur de work_mem ne peut pas être optimale pour tous les cas !
Cette annexe couvre les quatre configurations les plus courantes en production et développement :
🎯 Objectif : Gérer des milliers de transactions courtes par seconde avec une latence minimale.
Caractéristiques :
- Opérations : INSERT, UPDATE, DELETE, SELECT simples
- Volume par requête : 1-1000 lignes
- Fréquence : Très élevée (milliers/seconde)
- Latence : < 100ms (critique)
- Concurrence : Très élevée (200-500 connexions)
- Exemples : Applications Web, e-commerce, API REST, applications mobiles
Priorités de configuration :
- Latence faible : Minimiser le temps de réponse
- Haute concurrence : Gérer beaucoup de connexions simultanées
- Écritures fréquentes : Optimiser WAL et checkpoints
- Cache efficace : Maximiser le cache hit ratio
- Autovacuum agressif : Nettoyer rapidement les tuples morts
Compromis acceptés :
- Parallélisation limitée (overhead pour petites requêtes)
- work_mem faible (beaucoup de connexions)
- Pas de grandes agrégations (pas le cas d'usage)
🎯 Objectif : Analyser et agréger des millions/milliards de lignes avec un débit de données maximal.
Caractéristiques :
- Opérations : SELECT complexes avec GROUP BY, JOIN multiples, agrégations
- Volume par requête : Millions à milliards de lignes
- Fréquence : Faible (quelques requêtes/heure)
- Latence : Secondes à minutes (acceptable)
- Concurrence : Faible (10-50 connexions)
- Exemples : Data warehouse, BI, rapports, analytics
Priorités de configuration :
- Débit élevé : Lire et traiter des GB/s de données
- Parallélisation maximale : Utiliser tous les CPU
- Mémoire généreuse : work_mem élevé pour tris et groupements
- Scan séquentiel optimisé : Lire de grandes portions de tables
- Statistiques détaillées : Plans de requête optimaux
Compromis acceptés :
- Latence plus élevée (requêtes de 10-60 secondes OK)
- Peu de connexions simultanées
- Autovacuum moins agressif
🎯 Objectif : Équilibrer OLTP et OLAP sur la même instance.
Caractéristiques :
- Opérations : Mix de transactions rapides ET d'analyses complexes
- Volume : Variable selon le type de requête
- Fréquence : Élevée pour OLTP, faible pour OLAP
- Latence : Critique pour OLTP, acceptable pour OLAP
- Concurrence : Moyenne à élevée
- Exemples : Applications SaaS avec dashboards intégrés, CRM, ERP
Priorités de configuration :
- Compromis intelligent : 70% OLTP, 30% OLAP
- Séparation logique : Rôles et pools différenciés
- Ajustements dynamiques : work_mem par rôle/session
- Protection OLTP : Empêcher OLAP de bloquer OLTP
- Monitoring différencié : Distinguer les deux charges
Compromis nécessaires :
- Aucune des deux charges n'est 100% optimisée
- Configuration plus complexe
- Monitoring intensif requis
Architecture recommandée :
- Si possible : Séparation physique (réplication)
- Si budget limité : Séparation logique (rôles, pooling)
🎯 Objectif : Environnement simple et confortable pour développer et apprendre.
Caractéristiques :
- Matériel : Laptop (8-32 GB RAM, 4-8 CPU)
- Utilisateurs : Un seul développeur
- Données : Volume faible, données de test
- Sécurité : Minimale (pas de vraies données)
- Durabilité : Optionnelle (accepter perte si crash)
- Exemples : Développement d'applications, apprentissage SQL, tests
Priorités de configuration :
- Simplicité : Configuration minimale, compréhensible
- Feedback rapide : Voir immédiatement les résultats
- Logs détaillés : Apprendre en observant PostgreSQL
- Performance raisonnable : Confort sans surcharger le laptop
- Économie de ressources : Laisser de la RAM pour l'IDE
Compromis acceptés :
- Durabilité sacrifiée (fsync = off
⚠️ ) - Sécurité minimale (trust authentication)
- Pas d'optimisation extrême
- Configuration non-recommandée pour production
Posez-vous ces questions :
-
Quel est le type principal d'opérations ?
- Transactions courtes (INSERT/UPDATE/DELETE) → OLTP
- Analyses et rapports (SELECT complexes) → OLAP
- Les deux en proportions significatives → Mixed
- Développement sur laptop → Dev Local
-
Quelle est la latence acceptable ?
- < 100ms obligatoire → OLTP
- Quelques secondes OK → OLAP
- Variable selon l'opération → Mixed
- Non critique → Dev Local
-
Combien d'utilisateurs simultanés ?
- Centaines/milliers → OLTP
- Quelques dizaines → OLAP
- Mix → Mixed
- Un seul (vous) → Dev Local
-
Quel est le volume de données traité par requête ?
- 1-1000 lignes → OLTP
- Millions de lignes → OLAP
- Variable → Mixed
- Faible (tests) → Dev Local
Chaque section de cette annexe fournit :
- Configuration complète : Fichier postgresql.conf prêt à l'emploi
- Explications détaillées : Pourquoi chaque paramètre a cette valeur
- Dimensionnement : Comment adapter selon votre matériel
- Optimisations supplémentaires : Index, partitionnement, etc.
- Monitoring : Métriques à surveiller pour ce cas d'usage
- Checklist : Points de vérification avant mise en production
Principe fondamental : Les configurations de cette annexe sont des points de départ, pas des vérités absolues.
Processus itératif :
- Appliquer la configuration recommandée
- Mesurer les performances (voir section Monitoring)
- Identifier les goulots d'étranglement
- Ajuster les paramètres progressivement
- Valider l'amélioration
- Répéter
Outils de mesure :
pg_stat_statements: Analyser les requêtesEXPLAIN ANALYZE: Comprendre les plans- Monitoring système : CPU, RAM, I/O
- Logs PostgreSQL : Détecter anomalies
| Paramètre | OLTP | OLAP | Mixed | Dev Local |
|---|---|---|---|---|
| shared_buffers | 16 GB (25%) | 16 GB (25%) | 16 GB (25%) | 512 MB (3%) |
| effective_cache_size | 48 GB (75%) | 48 GB (75%) | 48 GB (75%) | 4 GB (25%) |
| work_mem | 32 MB | 1 GB | 64 MB* | 64 MB |
| maintenance_work_mem | 2 GB | 4 GB | 2 GB | 256 MB |
| max_connections | 300 | 50 | 250 | 20 |
| max_parallel_workers_per_gather | 2 | 8 | 4 | 2 |
| max_parallel_workers | 8 | 16 | 12 | 4 |
*Mixed : 64 MB global, mais ajusté par rôle (OLTP: 32 MB, OLAP: 512 MB)
| Paramètre | OLTP | OLAP | Mixed | Dev Local |
|---|---|---|---|---|
| fsync | on | on | on | off |
| synchronous_commit | on | on | on | off |
| checkpoint_timeout | 15min | 30min | 15min | 30min |
| autovacuum_naptime | 10s | 5min | 30s | 1min |
| log_statement | none | none | none | all |
| log_min_duration_statement | 100ms | 5s | 1s | 0 |
| Aspect | OLTP | OLAP | Mixed | Dev Local |
|---|---|---|---|---|
| Index | B-Tree partout | B-Tree + BRIN | Mixte | B-Tree basique |
| Partitionnement | Optionnel | Obligatoire | Recommandé | Non nécessaire |
| Vues matérialisées | Rare | Fréquent | Pour OLAP | Non nécessaire |
| Connection pooling | Obligatoire | Optionnel | Obligatoire | Non nécessaire |
| Réplication | HA recommandée | Read replica OLAP | Séparation OLTP/OLAP | Non applicable |
-
Ne JAMAIS copier une config de production vers développement
- Config prod optimisée pour 128 GB RAM → crash sur laptop 16 GB
- Toujours utiliser la config appropriée au contexte
-
Ne JAMAIS utiliser la config dev en production
fsync = offcause des pertes de données si crashlog_statement = allremplit le disque en quelques heures- Authentification
trust= aucune sécurité
-
Ne JAMAIS modifier tous les paramètres en même temps
- Changer un paramètre à la fois
- Mesurer l'impact avant le suivant
- Documenter chaque modification
-
Ne JAMAIS ignorer le monitoring
- Configuration sans mesure = optimisation à l'aveugle
- Activer
pg_stat_statementsdès le début - Surveiller : CPU, RAM, I/O, cache hit ratio, requêtes lentes
-
Commencer conservateur, augmenter progressivement
- Valeurs par défaut PostgreSQL sont déjà bonnes
- Augmenter un paramètre seulement si monitoring le justifie
-
Documenter votre configuration
- Pourquoi chaque paramètre a cette valeur
- Quand et pourquoi il a été modifié
- Impact observé de la modification
-
Tester en environnement de staging
- Jamais de changement direct en production
- Valider impact sur charge réelle
- Avoir un plan de rollback
-
Automatiser avec des outils
- PGTune : https://pgtune.leopard.in.ua/
- Génère config selon matériel et cas d'usage
- Bon point de départ
- pgtop : Monitoring temps réel
- pgBadger : Analyse de logs
- PGTune : https://pgtune.leopard.in.ua/
-
Maintenir la configuration à jour
- Réviser tous les 6 mois
- Ajuster si matériel change
- Adapter si charge évolue
Chaque configuration implique des compromis. Il n'existe pas de "meilleure configuration universelle".
OLTP :
- ❌ Parallélisation faible (
max_parallel_workers_per_gather = 2) - ✅ Pourquoi ? Requêtes courtes, overhead de parallélisation > gain
- ✅ Avantage : Plus de CPU disponible pour gérer concurrence
OLAP :
- ✅ Parallélisation maximale (
max_parallel_workers_per_gather = 8) - ✅ Pourquoi ? Requêtes longues sur millions de lignes
- ✅ Avantage : Diviser le travail = requête 5-8× plus rapide
- ❌ Inconvénient : Moins de ressources pour autres requêtes
Mixed :
- 🤝 Parallélisation modérée (
max_parallel_workers_per_gather = 4) - 🤝 Compromis entre les deux
- 🤝 + Ajustement par rôle (OLTP: 0, OLAP: 8)
OLTP :
- ❌ work_mem faible (32 MB)
- ✅ Pourquoi ? 300 connexions × 32 MB × 3 ops = 28 GB max (acceptable)
- ❌ Inconvénient : Grandes agrégations écrivent sur disque (rare en OLTP)
OLAP :
- ✅ work_mem élevé (1 GB)
- ✅ Pourquoi ? 50 connexions × 1 GB × 2 ops = 100 GB max (mais rarement atteint)
- ✅ Avantage : Tris et groupements en RAM (10-100× plus rapide)
- ❌ Risque : OOM si trop de connexions utilisent 1 GB simultanément
Solution Mixed :
- 🤝 work_mem global modéré (64 MB)
- 🤝 + Ajustement par rôle (OLTP: 32 MB, OLAP: 512 MB-1 GB)
- 🤝 Protection : timeouts pour limiter durée requêtes OLAP
Signaux indiquant un changement nécessaire :
-
OLTP → Mixed
- Apparition de rapports/dashboards intégrés
- Utilisateurs demandent des analyses
- Requêtes de plus en plus complexes et longues
-
Mixed → Séparation (OLTP + OLAP)
- OLAP consomme > 30% des ressources
- Latence OLTP dégradée par requêtes OLAP
- Locks fréquents (OLAP bloque OLTP)
- Budget permet un second serveur
-
Dev → Production
- Application prête à déployer
- Besoin de durabilité et sécurité
- Charge réelle (utilisateurs)
- Identifier le nouveau cas d'usage
- Préparer nouvelle configuration (fichier postgresql.conf)
- Tester en staging avec charge simulée
- Planifier fenêtre de maintenance
- Appliquer configuration + redémarrage
- Monitorer intensément pendant 24-48h
- Ajuster si nécessaire
Exemple : Dev → Production
# 1. Sauvegarder config actuelle
cp /etc/postgresql/18/main/postgresql.conf postgresql.conf.dev
# 2. Appliquer config production OLTP
cp postgresql.conf.oltp /etc/postgresql/18/main/postgresql.conf
# 3. Vérifier syntaxe
/usr/lib/postgresql/18/bin/postgres -C config_file=/etc/postgresql/18/main/postgresql.conf
# 4. Redémarrer
sudo systemctl restart postgresql@18-main
# 5. Vérifier paramètres actifs
psql -c "SHOW shared_buffers;"
psql -c "SHOW work_mem;"
psql -c "SHOW fsync;" # DOIT être 'on' en production ! Cette annexe est divisée en quatre sections principales, une pour chaque cas d'usage :
- Configuration complète pour charges transactionnelles
- Optimisation latence et concurrence
- Connection pooling (PgBouncer)
- Index et autovacuum agressif
- Monitoring cache hit ratio et requêtes lentes
- Configuration complète pour charges analytiques
- Optimisation débit et parallélisation
- Partitionnement et index BRIN
- Vues matérialisées
- Monitoring fichiers temporaires et parallélisation
- Configuration compromis intelligente
- Séparation logique par rôles
- Ajustements dynamiques work_mem
- Protection OLTP contre OLAP
- Monitoring différencié par type de charge
- Configuration simplifiée pour laptop
- Logs détaillés pour apprentissage
- Scripts de seed et reset
- Intégration avec outils de développement
- Outils graphiques (pgAdmin, DBeaver)
-
PostgreSQL 18 installé
- Version 18 recommandée (dernière version stable)
- Versions 16-17 compatibles (quelques paramètres diffèrent)
-
Accès superutilisateur
- Modifier postgresql.conf
- Modifier pg_hba.conf
- Redémarrer PostgreSQL
-
Connaissances de base
- SQL fondamental
- Ligne de commande (bash/powershell)
- Concepts PostgreSQL de base (tables, index, transactions)
-
Outils recommandés
psql(client ligne de commande)- Éditeur de texte
- Outil graphique optionnel (pgAdmin, DBeaver)
Chaque configuration est fournie dans un fichier markdown séparé :
annexe-d-configurations/
├── 00-introduction.md (ce fichier)
├── 01-configuration-oltp.md (Section 1)
├── 02-configuration-olap.md (Section 2)
├── 03-configuration-mixed-workload.md (Section 3)
└── 04-configuration-developpement-local.md (Section 4)
Chaque section contient :
- Introduction au cas d'usage
- Configuration postgresql.conf complète
- Explications détaillées de chaque paramètre
- Optimisations supplémentaires (index, partitionnement, etc.)
- Requêtes de monitoring
- Checklist de validation
- Erreurs courantes à éviter
Les configurations utilisent ce format :
# Commentaire explicatif
parametre_postgresql = valeur # Raison de cette valeurExemple :
# Mémoire pour opérations de tri et groupement
work_mem = 32MB # Faible car beaucoup de connexions (OLTP)- ✅ Recommandé : Configuration idéale pour ce cas d'usage
- ❌ Déconseillé : À éviter pour ce cas d'usage
⚠️ Attention : Paramètre critique, lire avertissement- 🤝 Compromis : Équilibre entre plusieurs objectifs
- 💡 Astuce : Conseil pratique
- 🐛 Debug : Aide au débogage
Les paramètres sont classés par importance :
- 🔴 CRITIQUE : Impact majeur, à configurer en premier
- 🟠 IMPORTANT : Impact significatif, à configurer rapidement
- 🟡 RECOMMANDÉ : Amélioration notable, configurer si temps
- 🟢 OPTIONNEL : Amélioration mineure, configurer si besoin spécifique
- Configuration : https://www.postgresql.org/docs/18/runtime-config.html
- Performance Tips : https://www.postgresql.org/docs/18/performance-tips.html
- Monitoring : https://www.postgresql.org/docs/18/monitoring.html
- PGTune : https://pgtune.leopard.in.ua/
- pgBench : Outil de benchmark intégré à PostgreSQL
- pgBadger : Analyse de logs
- Mailing list pgsql-performance : Discussions sur la performance
- Reddit r/PostgreSQL : Communauté active
- Stack Overflow : Tag [postgresql-performance]
- Percona Blog : https://www.percona.com/blog/
- CrunchyData Blog : https://www.crunchydata.com/blog
- 2ndQuadrant Blog : Experts PostgreSQL
Maintenant que vous comprenez :
- Les différents cas d'usage PostgreSQL
- Pourquoi la configuration doit s'adapter
- Les compromis inhérents à chaque choix
- Comment utiliser cette annexe
→ Passez à la section correspondant à votre cas d'usage :
- OLTP si vous gérez des transactions rapides et nombreuses
- OLAP si vous faites de l'analyse et du reporting
- Mixed si vous combinez les deux
- Dev Local si vous développez sur votre machine
Chaque section fournit une configuration complète, expliquée et prête à l'emploi.
Bon paramétrage PostgreSQL ! 🐘⚙️