🔝 Retour au Sommaire
- Introduction aux Requêtes de Référence
- Comment Utiliser Ces Requêtes
- Organisation et Catégories
- Outils et Environnement
- Bonnes Pratiques d'Utilisation
- Index des Requêtes Disponibles
Cette annexe est une bibliothèque de requêtes SQL prêtes à l'emploi pour :
- Administrer votre base de données PostgreSQL
- Monitorer les performances et la santé du système
- Analyser les données et les statistiques
- Diagnostiquer les problèmes rapidement
- Optimiser les performances
Ces requêtes ont été soigneusement sélectionnées et testées pour vous aider dans les tâches quotidiennes de gestion et d'optimisation de PostgreSQL.
- Apprentissage accéléré : Voir des requêtes SQL réelles et professionnelles
- Copier-coller direct : Pas besoin de réinventer la roue
- Comprendre les concepts : Chaque requête est expliquée
- Gain de temps : Requêtes optimisées et éprouvées
- Meilleures pratiques : Apprendre des patterns efficaces
- Référence rapide : Trouver la bonne requête en quelques secondes
- Base de départ : Personnaliser selon vos besoins spécifiques
- Validation : Confirmer vos approches
- Documentation : Partager avec votre équipe
-
❌ Pas un tutoriel SQL complet : Pour apprendre SQL, référez-vous aux parties principales du cours
-
❌ Pas exhaustif : Impossible de couvrir tous les cas d'usage
-
❌ Pas un remplacement de la documentation : Consultez toujours la doc PostgreSQL officielle pour les détails
-
✅ C'est une boîte à outils pratique pour les situations courantes
-
✅ Un point de départ pour vos propres requêtes
-
✅ Une référence rapide pour les tâches d'administration
Chaque requête de référence suit cette structure standard :
-- ========================================
-- TITRE DE LA REQUÊTE
-- ========================================
-- Description : Ce que fait cette requête
-- Cas d'usage : Quand l'utiliser
-- Fréquence recommandée : Quotidien/Hebdomadaire/Mensuel/À la demande
-- ========================================
SELECT
-- Colonnes avec commentaires explicatifs
colonne1, -- Commentaire sur colonne1
colonne2, -- Commentaire sur colonne2
fonction(colonne3) AS alias -- Commentaire sur le calcul
FROM
table_source
WHERE
condition = 'valeur'
ORDER BY
colonne1 DESC
LIMIT 20;
-- ========================================
-- INTERPRÉTATION DES RÉSULTATS
-- ========================================
-- Valeur normale : Description
-- Seuil d'alerte : Description
-- Action recommandée : Description
-- ========================================La plupart des requêtes nécessitent une personnalisation :
-- Exemple générique
SELECT * FROM ma_table WHERE status = 'active';
-- Adaptez avec vos vrais noms
SELECT * FROM orders WHERE status = 'pending';-- Requête avec seuil par défaut
WHERE n_dead_tup > n_live_tup * 0.2 -- 20% de bloat
-- Ajustez selon votre tolérance
WHERE n_dead_tup > n_live_tup * 0.1 -- 10% de bloat (plus strict)-- Par défaut : Top 20
LIMIT 20;
-- Ajustez selon vos besoins
LIMIT 50; -- Top 50
-- Ou supprimez la limite pour tout voirIl est recommandé de créer votre propre bibliothèque de requêtes :
/sql-queries/
├── admin/
│ ├── locks.sql
│ ├── bloat.sql
│ └── index_usage.sql
├── monitoring/
│ ├── cache_hit_ratio.sql
│ └── slow_queries.sql
└── analysis/
├── table_sizes.sql
└── statistics.sql
-- Créer un schéma dédié
CREATE SCHEMA IF NOT EXISTS monitoring;
-- Créer des vues pour vos requêtes fréquentes
CREATE VIEW monitoring.top_tables_by_size AS
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 20;
-- Utilisation simple
SELECT * FROM monitoring.top_tables_by_size;La plupart des éditeurs (VS Code, DataGrip, pgAdmin) supportent les snippets :
// Exemple de snippet VS Code
{
"Top Tables by Size": {
"prefix": "pgtop",
"body": [
"SELECT",
" schemaname,",
" tablename,",
" pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size",
"FROM pg_tables",
"WHERE schemaname = '${1:public}'",
"ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC",
"LIMIT ${2:20};"
],
"description": "Liste les tables les plus volumineuses"
}
}- ✅ Toutes les requêtes SELECT sont sûres
- ✅ Elles ne modifient pas les données
- ✅ Peuvent être exécutées en production sans risque
⚠️ VACUUM, ANALYZE, REINDEX peuvent consommer des ressources⚠️ Exécutez-les pendant les heures creuses⚠️ VACUUM FULL pose un verrou exclusif : NE PAS exécuter en production
- 🔴 pg_terminate_backend() : Tue une connexion
- 🔴 DROP INDEX : Supprime un index
- 🔴 ALTER TABLE : Modifie la structure
Règle d'or : Toujours tester en staging avant production !
Les requêtes sont organisées en trois catégories principales :
Annexe C : Requêtes SQL de Référence
│
├── 1. Requêtes d'Administration
│ ├── Gestion des Locks (Verrous)
│ ├── Détection et Analyse du Bloat
│ └── Surveillance de l'Utilisation des Index
│
├── 2. Requêtes de Monitoring
│ ├── Cache Hit Ratio
│ ├── Slow Queries (Requêtes Lentes)
│ └── Métriques Complémentaires
│
└── 3. Requêtes d'Analyse
├── Taille des Objets (Tables, Index, Bases)
├── Statistiques des Tables
├── Statistiques des Colonnes
└── Analyse de la Fragmentation
Objectif : Gérer les aspects opérationnels quotidiens de PostgreSQL
- Identifier les transactions bloquantes
- Détecter les deadlocks
- Résoudre les contentions
Cas d'usage :
- Application figée, utilisateurs bloqués
- Timeout sur les requêtes
- Diagnostic de performance soudaine
- Mesurer l'espace mort dans les tables
- Détecter le bloat dans les index
- Planifier les opérations de nettoyage
Cas d'usage :
- Table qui grossit anormalement
- Performances qui se dégradent dans le temps
- Optimisation de l'espace disque
- Identifier les index inutilisés
- Détecter les index redondants
- Mesurer l'efficacité des index
Cas d'usage :
- Optimisation des performances INSERT/UPDATE
- Réduction de l'empreinte disque
- Amélioration du cache hit ratio
📄 Document détaillé : requetes-administration-postgresql.md
Objectif : Surveiller la santé et les performances en temps réel
- Mesurer l'efficacité du buffer cache
- Identifier les tables mal cachées
- Optimiser la configuration de la mémoire
Cas d'usage :
- Validation de la configuration
shared_buffers - Détection de problèmes d'I/O
- Optimisation du coût cloud (I/O)
- Identifier les requêtes les plus chronophages
- Analyser les patterns de performance
- Prioriser les optimisations
Cas d'usage :
- Diagnostic de lenteur applicative
- Optimisation proactive
- Analyse post-déploiement
- Connexions actives
- Checkpoints et WAL
- Risque de XID wraparound
- Réplication lag
Cas d'usage :
- Tableau de bord de santé
- Alertes automatisées
- Planification de capacité
📄 Document détaillé : requetes-monitoring-postgresql.md
Objectif : Comprendre la structure et la croissance des données
- Mesurer la taille des bases, tables, index
- Suivre la croissance dans le temps
- Prévoir les besoins en stockage
Cas d'usage :
- Planification de capacité
- Optimisation des coûts
- Identification des candidats au partitionnement
- Analyser l'activité (lectures/écritures)
- Comprendre les patterns d'accès
- Valider l'efficacité des index
Cas d'usage :
- Optimisation de schéma
- Choix de stratégie de cache
- Décisions d'architecture
- Cardinalité et distribution
- Corrélation physique/logique
- Valeurs les plus fréquentes
Cas d'usage :
- Optimisation d'index
- Compréhension du modèle de données
- Validation des estimations du planificateur
- Mesurer le bloat précis avec pgstattuple
- Analyser la fragmentation des index
- Planifier les opérations de maintenance
Cas d'usage :
- Optimisation d'espace disque
- Amélioration des performances
- Maintenance préventive
📄 Document détaillé : requetes-analyse-postgresql.md
Avantages :
- Léger et rapide
- Scriptable
- Disponible partout
Installation :
# Debian/Ubuntu
sudo apt-get install postgresql-client
# macOS
brew install postgresql
# Windows
# Télécharger depuis postgresql.orgConfiguration recommandée (.psqlrc) :
-- Activer le timing des requêtes
\timing on
-- Affichage étendu automatique pour résultats larges
\x auto
-- Historique des commandes
\set HISTSIZE 10000
-- Pager automatique
\pset pager always
-- Format de date lisible
\pset null '(null)'Avantages :
- Interface visuelle intuitive
- Éditeur SQL avec coloration syntaxique
- Visualisation des données
- Outils de monitoring intégrés
Téléchargement : https://www.pgadmin.org/
Avantages :
- Support de multiples SGBD
- Éditeur puissant avec autocomplétion
- Visualisation ERD
- Export de données flexible
Téléchargement : https://dbeaver.io/
Avantages :
- Autocomplétion intelligente
- Refactoring SQL
- Intégration Git
- Debugging de fonctions
Téléchargement : https://www.jetbrains.com/datagrip/
Certaines requêtes nécessitent des extensions :
Utilité : Tracking de toutes les requêtes exécutées
-- Installation (une fois par base)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Configuration dans postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all Nécessite : Redémarrage de PostgreSQL
Utilité : Analyse précise du bloat
CREATE EXTENSION IF NOT EXISTS pgstattuple;Attention : Les fonctions pgstattuple font un scan complet, utilisez hors production.
Permissions minimum :
-- Créer un utilisateur monitoring
CREATE ROLE monitoring_user LOGIN PASSWORD 'secure_password';
-- Donner accès aux vues système
GRANT CONNECT ON DATABASE ma_base TO monitoring_user;
GRANT USAGE ON SCHEMA pg_catalog TO monitoring_user;
GRANT SELECT ON ALL TABLES IN SCHEMA pg_catalog TO monitoring_user;
-- Accès à pg_stat_statements
GRANT EXECUTE ON FUNCTION pg_stat_statements_reset() TO monitoring_user;Permissions requises :
-- Pour pg_terminate_backend(), pg_cancel_backend()
GRANT pg_signal_backend TO admin_user;
-- Pour VACUUM, ANALYZE
GRANT ma_table TO admin_user;
-- Pour REINDEX
-- Nécessite ALTER privilège ou être owner# .bashrc ou .zshrc
export PGHOST=localhost
export PGPORT=5432
export PGDATABASE=ma_base
export PGUSER=mon_user
# Ne pas mettre PGPASSWORD, utilisez .pgpass
# Fichier .pgpass (Linux/macOS: ~/.pgpass, Windows: %APPDATA%\postgresql\pgpass.conf)
# Format: hostname:port:database:username:password
localhost:5432:ma_base:mon_user:mot_de_passePermissions .pgpass :
chmod 600 ~/.pgpass# .bashrc
alias pgdev='psql -h localhost -U dev_user -d dev_db'
alias pgprod='psql -h prod-server -U readonly_user -d prod_db'
alias pgtop='psql -c "SELECT * FROM monitoring.database_health"' - ✅ Lecture seule ? : Requête SELECT → Sûr
- ✅ Environnement : Production ou Staging ?
- ✅ Impact : Requête coûteuse (pgstattuple) ?
- ✅ Backup : Si modification de structure (ALTER, DROP)
- ✅ Permissions : Ai-je les droits nécessaires ?
Pour toute modification :
- Tester en développement d'abord
- Valider en staging
- Appliquer en production avec un plan de rollback
Les métriques n'ont de sens que dans votre contexte :
-
Cache hit ratio 85% :
- Peut être acceptable pour un data warehouse (OLAP)
- Problématique pour une API transactionnelle (OLTP)
-
Table de 500 GB :
- Normal pour des logs
- Énorme pour une table de configuration
Une métrique isolée dit peu de choses. Surveillez les tendances :
Jour 1 : Cache hit ratio = 97%
Jour 2 : Cache hit ratio = 97%
Jour 3 : Cache hit ratio = 95%
Jour 4 : Cache hit ratio = 92% ← Tendance à la baisse, enquêter !
Cherchez les corrélations entre métriques :
- Bloat élevé + Cache hit ratio faible → VACUUM nécessaire
- Slow queries + Locks élevés → Contention
- Croissance rapide + Disk full → Archivage urgent
Tenir un journal des requêtes exécutées et de leurs effets :
## Journal d'Administration PostgreSQL
### 2025-11-21 14:30 - Diagnostic de Lenteur
**Problème** : Application lente depuis 13h00
**Requêtes exécutées** :
1. Cache hit ratio global → 97% (OK)
2. Slow queries top 20 → Requête sur orders identifiée (avg: 2.5s)
3. EXPLAIN ANALYZE sur la requête lente → Seq Scan détecté
**Action prise** :
```sql
CREATE INDEX idx_orders_user_created ON orders(user_id, created_at);Résultat : Requête passée de 2.5s à 45ms (55× plus rapide)
Status : ✅ Résolu
### 5.4. Automatisation et Alerting
#### Scripts de Monitoring Automatisés
```bash
#!/bin/bash
# check_database_health.sh
# Configuration
PGDATABASE="ma_base"
ALERT_EMAIL="admin@example.com"
CACHE_HIT_THRESHOLD=95
# Vérifier cache hit ratio
CACHE_HIT=$(psql $PGDATABASE -t -c "
SELECT round(100.0 * blks_hit / NULLIF(blks_hit + blks_read, 0), 2)
FROM pg_stat_database
WHERE datname = current_database();
")
if (( $(echo "$CACHE_HIT < $CACHE_HIT_THRESHOLD" | bc -l) )); then
echo "ALERTE : Cache hit ratio = $CACHE_HIT% (seuil: $CACHE_HIT_THRESHOLD%)" | \
mail -s "PostgreSQL Alert" $ALERT_EMAIL
fi
# crontab -e
# Tous les jours à 2h du matin
0 2 * * * /path/to/check_database_health.sh
# Toutes les heures
0 * * * * /path/to/check_slow_queries.sh
# Tous les lundis à 3h
0 3 * * 1 /path/to/weekly_bloat_check.shUtilisez Git pour versionner vos scripts SQL :
# Structure de répertoire
sql-library/
├── README.md
├── admin/
│ ├── 01_locks.sql
│ ├── 02_bloat.sql
│ └── 03_index_usage.sql
├── monitoring/
│ ├── 01_cache_hit_ratio.sql
│ └── 02_slow_queries.sql
└── analysis/
└── 01_table_sizes.sql
# Git
git init
git add .
git commit -m "Initial SQL library" Avantages :
- Historique des modifications
- Travail collaboratif
- Rollback facile
📄 Document complet : requetes-administration-postgresql.md
| Requête | Description | Fréquence |
|---|---|---|
| Locks actifs | Liste tous les verrous en cours | À la demande |
| Transactions bloquantes | Identifie qui bloque qui | À la demande |
| Deadlocks en cours | Détecte les interblocages | À la demande |
| Requête | Description | Fréquence |
|---|---|---|
| Bloat par table | Estime le % de bloat | Hebdomadaire |
| Bloat précis (pgstattuple) | Mesure exacte | Mensuel |
| Bloat des index | Fragmentation des index | Hebdomadaire |
| Requête | Description | Fréquence |
|---|---|---|
| Index inutilisés | idx_scan = 0 | Mensuel |
| Index redondants | Doublons détectés | Mensuel |
| Taux d'utilisation | Ratio index vs seq scan | Hebdomadaire |
📄 Document complet : requetes-monitoring-postgresql.md
| Requête | Description | Fréquence |
|---|---|---|
| Cache hit ratio global | Par base de données | Quotidien |
| Cache hit ratio par table | Identification des tables | Hebdomadaire |
| Cache hit ratio par index | Performance des index | Hebdomadaire |
| Requête | Description | Fréquence |
|---|---|---|
| Top 20 slow queries (temps total) | Cumul le plus élevé | Quotidien |
| Top 20 slow queries (temps moyen) | Temps moyen le plus élevé | Quotidien |
| Requêtes en cours | Temps réel | À la demande |
| Requêtes avec I/O élevé | Lectures disque | Hebdomadaire |
| Requête | Description | Fréquence |
|---|---|---|
| Connexions actives | État des connexions | Quotidien |
| Taille des tables | Top 20 | Quotidien |
| Checkpoints | Fréquence et timing | Hebdomadaire |
| XID wraparound risk | Risque de wraparound | Hebdomadaire |
| Réplication lag | Retard des replicas | Quotidien (si réplication) |
📄 Document complet : requetes-analyse-postgresql.md
| Requête | Description | Fréquence |
|---|---|---|
| Taille de toutes les bases | Vue d'ensemble | Hebdomadaire |
| Top 20 tables par taille | Les plus volumineuses | Quotidien |
| Ratio table/index | Distribution de taille | Hebdomadaire |
| Croissance dans le temps | Tracking historique | Quotidien |
| Taille par schéma | Si multi-schémas | Hebdomadaire |
| Requête | Description | Fréquence |
|---|---|---|
| Vue d'ensemble statistiques | n_live_tup, n_dead_tup | Quotidien |
| Tables les plus actives (lecture) | seq_scan, idx_scan | Hebdomadaire |
| Tables les plus actives (écriture) | INSERT, UPDATE, DELETE | Hebdomadaire |
| Statistiques I/O | Cache vs disque | Hebdomadaire |
| Requête | Description | Fréquence |
|---|---|---|
| Cardinalité des colonnes | Valeurs distinctes | Mensuel |
| Distribution MCV | Valeurs les plus fréquentes | Mensuel |
| Corrélation physique | Ordre des données | Mensuel |
| Colonnes volumineuses | avg_width élevé | Mensuel |
| Requête | Description | Fréquence |
|---|---|---|
| Fragmentation (pgstattuple) | Mesure précise | Mensuel |
| Estimation bloat rapide | Via pg_stat | Hebdomadaire |
| Fragmentation index | pgstatindex | Mensuel |
Si vous débutez avec PostgreSQL, voici un parcours recommandé :
- Installer un client SQL (psql ou pgAdmin)
- Se connecter à votre base
- Exécuter les requêtes de base :
- Taille de la base
- Liste des tables
- Cache hit ratio global
- Installer pg_stat_statements
- Explorer les slow queries
- Mettre en place un suivi quotidien du cache hit ratio
- Créer vos premières vues de monitoring
- Comprendre les locks
- Analyser le bloat de vos tables principales
- Auditer l'utilisation des index
- Planifier votre première maintenance (VACUUM, ANALYZE)
- Créer des scripts de monitoring
- Planifier des vérifications automatiques (cron)
- Mettre en place des alertes
- Documenter vos processus
- PostgreSQL: Up and Running (Regina Obe, Leo Hsu)
- The Art of PostgreSQL (Dimitri Fontaine)
- Mastering PostgreSQL (Hans-Jürgen Schönig)
- PostgreSQL Wiki
- Planet PostgreSQL - Agrégateur de blogs
- Percona PostgreSQL Blog
- 2ndQuadrant Blog
- Reddit : r/PostgreSQL
- Discord : Communauté PostgreSQL francophone
- Stack Overflow : Tag
postgresql - Mailing lists : pgsql-general@postgresql.org
Cette annexe est un document vivant. Vos contributions sont les bienvenues :
- Nouvelles requêtes : Partagez vos trouvailles
- Améliorations : Optimisations, clarifications
- Corrections : Erreurs, typos
- Cas d'usage : Exemples réels
- ✅ Bibliothèque prête à l'emploi : Requêtes testées et documentées
- ✅ Trois catégories : Administration, Monitoring, Analyse
- ✅ Personnalisables : Adaptez à votre contexte
- ✅ Documents détaillés : 3 fichiers spécialisés disponibles
- ✅ Bonnes pratiques : Sécurité, documentation, automatisation
Annexe C : Requêtes SQL de Référence
│
├── 📄 requetes-sql-reference-introduction.md (ce fichier)
│ └── Vue d'ensemble et guide d'utilisation
│
├── 📄 requetes-administration-postgresql.md
│ ├── Locks (Verrous)
│ ├── Bloat (Gonflement)
│ └── Index Usage
│
├── 📄 requetes-monitoring-postgresql.md
│ ├── Cache Hit Ratio
│ ├── Slow Queries
│ └── Métriques Complémentaires
│
└── 📄 requetes-analyse-postgresql.md
├── Taille des Objets
├── Statistiques des Tables
├── Statistiques des Colonnes
└── Analyse de la Fragmentation
📖 Consultez maintenant les documents détaillés selon vos besoins :
- Problème immédiat (app figée, lenteur) →
requetes-administration-postgresql.md - Suivi de santé quotidien →
requetes-monitoring-postgresql.md - Planification et croissance →
requetes-analyse-postgresql.md