Vous n'êtes pas identifié(e).
Pages : 1
Bonjour à tous,
Il y a peu, nous avons tenté sur notre base une requête d'ajout de colonne dans une table de 20 Go avec un default false. (base en production)
La requête a mis énormément de temps a se faire, ne s'est pas terminée, et à surtout fait grimper la taille totale de la base de 170 à 200Go environ.
Suite au plantage, nous avons refait le même requête, sans le default false, et la cela a fonctionné nickel, en quelques secondes la requête s'était terminée, la base n'a pas bougé niveau taille.
Bref.
Ce qui est étrange, c'est que lorsque je regarde la taille des tables une à une, je ne vois aucune table qui a grossi, et je ne comprend pas ou sont passés ces 30 Go !
Pour tenter de regagner cet espace , j'ai effectué un vacuum full, mais malgré cela, je ne retrouve toujours pas mes 30 GO
Différences vues :
psql db
\l+
db | toto | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 | | 131 GB | pg_default |
Et la requête que je lance pour voir le détail de ma base :
select sum(pg_table_size(table_schema || '.' || table_name)) as data,
sum(pg_indexes_size(table_schema || '.' || table_name)) as index,
sum(pg_total_relation_size(table_schema || '.' || table_name)) As total
FROM information_schema.tables;
Résultat : 99 Go
65117700096 | 33858953216 | 98976653312
Quand je fais le cumul des tailles de toutes les tables (data + index + toast), je tombe aussi sur 99 Go.
Sauriez vous pourquoi j'ai ce soucis ?
ps : Je suis en version 9.0
Hors ligne
Lorsque vous mettez une valeur par défaut à une nouvelle colonne, PostgreSQL est obligé de réécrire toute la table. D'où le temps que ça a pris. Sans le default, PostgreSQL ne fait que changer quelques méta-données et du coup, c'est immédiat.
Concernant les 30 Go pris, ce doit être un fichier temporaire qui est resté lors de la réécriture de la table. Difficile d'en dire plus, surtout que rien n'indique dans votre message comment la requête "ne s'est pas terminée".
Guillaume.
Hors ligne
Merci de votre réponse guillaume
La transaction s'est arrêtée car j'ai renseigné le paramètre statement_timeout=1800000 sur la base (30 mns), et que la transaction a duré ce temps la.
Il n'y a a priori pas de fichiers temporaires sur la base, c'est bein le dossier dans 'base' qui fait cette taille la (j'ai créé un tablespace temporaire sur un autre volume, il est vide)
De plus, ils auraient du se supprimer après restart de la base dans ce cas, non ?
J’avais peut etre pensé à une table temporaire, amis lorsque je trie les tables par tailles, je ne voit rien qui correspond à ça...
Hors ligne
Pages : 1