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:
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:
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:
REINDEX
Et le résultat est nettement plus appréciable:
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.