Quand une base Postgresql prend trop de place, il est temps de faire place. Et si bien que parfois, un DELETE massif d’une table entière et d’un VACUUM FULL derrière ne suffisent plus. Du coup, j’ai découvert cet après midi quelques manipulations pour voir en détail un peu plus comment faire de la place.

Par exemple, j’ai fais un simple « DELETE * FROM obj; », suivi d’un VACUUM. Bien qu’ayant gagné 300 Mo, je vois quand même que ma table, même vide, prend encore pas mal de place:

engineProd=# SELECT COUNT(*) FROM obj;
 COUNT
-------
     0
(1 ROW)

engineProd=# SELECT pg_size_pretty(pg_total_relation_size('obj'));
 pg_size_pretty
----------------
 85 MB
(1 ROW)

Il est possible dans Postgresql de monitorer très précisement la place utilisée par les tables et leurs index: Il s’agit d’utiliser les tables internes, et en particulier pg_class:

engineProd=# SELECT relname, relpages FROM pg_class WHERE relpages > 1000 ORDER BY relpages DESC;
           relname           | relpages
-----------------------------+----------
 obj_hash_index              |     4322
 obj_action_created_at_index |     1586
 obj_created_at_index        |     1527
 obj_st_to_index             |     1262
 obj_st_from_index           |     1248
 obj_status_index            |     1224
 obj_pkey                    |     1223

Le trick est de réindexer (avec REINDEX) la table après:

engineProd=# REINDEX TABLE obj;
REINDEX

Et le résultat est nettement plus appréciable:

engineProd=# SELECT pg_size_pretty(pg_total_relation_size('obj'));
 pg_size_pretty
----------------
 88 kB
(1 ROW)

Noter qu’il y a une page un peu plus technique à propos de tout cela dans le manuel de Postgresql.

Leave a reply

required

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>