J'ai une table fortement utilisée (avec environ 5 millions de lignes) dans une base de données PostgreSQL dans laquelle je souhaite déposer une colonne et récupérer l'espace utilisé la colonne.
Les docs suggèrent de faire une réécriture de table ALTER TABLE
Pour forcer l'espace en arrière, mais ce n'est pas sûr de fonctionner pendant que la table est utilisée et causerait des temps d'arrêt. Existe-t-il des options pratiques qui ne nécessitent aucun temps d'arrêt? J'ai essayé d'exécuter l'outil pgcompact
, mais cela n'a rien changé.
ALTER TABLE .. DROP COLUMN ...
marque la colonne comme supprimée dans la table du système pg_attribute
. La table elle-même n'est pas manipulée autrement tant que des lignes ne sont pas réécrites d'une manière ou d'une autre. La chute elle-même est très rapide, mais elle prend une brève ACCESS EXCLUSIVE
serrure. Je n'appellerais pas que "temps d'arrêt", cependant.
Récupérer réellement l'espace disque est la partie délicate. Vous pouvez utiliser l'outil communautaire pg_repack
au lieu de VACUUM FULL
ou CLUSTER
(qui verrouille la table exclusivement). Il évite les verrous exclusifs, mais il a besoin d'espace libre sur le disque à utiliser. Plus de détails:
Ou, si les lignes de votre table sont mises à jour éventuellement, vous pouvez simplement l'attendre. Chaque version de la nouvelle ligne est écrite sans la colonne supprimée. Lorsque la version ancienne est écrasée ou supprimée par VACUUM
vous regagnez l'espace.