PostgreSQL : précisions pour VACUUM/ANALYZE

This commit is contained in:
Romain Dessort 2018-01-25 15:49:54 -05:00
parent 5ba5f277ab
commit b9f133a075

View file

@ -457,7 +457,7 @@ $ psql <base> < dump.sql
$ pg_restore -F c all.dump
~~~
**Important :** il est nécessaire de faire un `ANALYSE` après une restauration de tables ou bases de données afin de mettre à jour les statistiques de PostgreSQL. Ces statistiques sont utilisées par PostgreSQL pour déterminer la manière la plus optimum de requêter la base en fonction de la répartition des valeurs des champs.
**Important :** il est nécessaire de faire un `ANALYZE` après une restauration de tables ou bases de données afin de mettre à jour les statistiques de PostgreSQL. Ces statistiques sont utilisées par PostgreSQL pour déterminer la manière la plus optimum de requêter la base en fonction de la répartition des valeurs des champs.
Optimisations pour la restauration :
@ -847,9 +847,28 @@ $ pg_top
Et taper `?` pour la liste de toutes les commandes possibles.
## VACUUM
## VACUUM et ANALYZE
TODO : expliquer davantage
`VACUUM` permet de nettoyer les données obsolètes (lignes d'une table qui ont été modifiées par un `UPDATE` par exemple) que PostgreSQL n'efface pas volontairement du disque puisque d'autres requêtes plus anciennes peuvent encore y accéder.
`ANALYZE` permet à PostgreSQL de collecter et mettre à jour ses statistiques sur la répartition des données en base afin que le planificateur de requêtes ait des données les plus précises possible.
ANALYZE sur toutes les tables d'une base de données :
~~~
=# ANALYZE;
~~~
Ces 2 opérations peuvent être exécutées en un seul coup :
~~~
=# VACUUM ANALYZE;
~~~
Par défaut, PostgreSQL lance au démarrage le processus `autovacuum launcher process` qui se charge d'exécuter des `VACUUM` et `ANALYZE` à intervalles réguliers. Les `VACUUM` et `ANALYZE` sont exécutés seulement si la quantité de données à nettoyer/réanalyser (en fait le nombre de `DELETE` et `UPDATE` que la table a reçu depuis son dernier passage) dépasse un certain seuil configurable.
`VACUUM` n'efface pas réellement les données sur le disque, il marque leurs emplacements comme libre de sorte que PostgreSQL puisse écrire dessus lorsqu'il aura à nouveau besoin d'écrire des données. Pour le forcer à libérer l'espace disque au niveau du système de fichiers, il faut exécuter un `VACUUM FULL`. Cette opération n'est pas faite par le démon `autovacuum` car elle requière de locker les tables en lecture et écriture (aucune requête n'est possible durant un `VACUUM FULL`). Le cas où l'on aurait besoin de lancer une telle opération serait après une grosse suppression de données (`DELETE`, `TRUNCATE`) et où on aurait besoin de récupérer de l'espace disque au niveau du système de fichiers pour autre chose. Dans les autres cas, il n'y a généralement pas d'utilité à lancer un `VACUUM FULL`.
Faire un VACUUM FULL sur toutes les bases de données :
@ -857,13 +876,6 @@ Faire un VACUUM FULL sur toutes les bases de données :
$ vacuumdb -a -f -v
~~~
ANALYSE sur toutes les tables d'une base de données :
~~~
$ psql mydb
=# ANALYZE;
~~~
## Benchmark
pgbench est un outil intégré à PostgreSQL (dans debian, il est dans le paquet, postgresql-contrib - /usr/lib/postgresql/8.4/bin/pgbench), il permet de réaliser des tests, et d'avoir les résultats en transactions par secondes (tps). Plus d'inos sur la [doc officielle](http://docs.postgresqlfr.org/8.3/pgbench.html).