En raison de la façon dont PostgreSQL gère les transactions et les accès concurrents, MVCC - Multi-Version Concurrency Control, vous pouvez obtenir des ballonnements. Dans PostgreSQL, lorsque vous effectuez un UPDATE
ou DELETE
, la ligne n'est pas réellement supprimée physiquement. Pour a DELETE
, il marque simplement la ligne comme indisponible pour les transactions futures, et pour UPDATE
, sous le capot, c'est un combiné INSERT
alors DELETE
, où la version précédente de la ligne est marquée comme indisponible.
Bien que les données soient marquées comme indisponibles, elles sont toujours là et l'espace ne peut pas être utilisé. Pour marquer ensuite l'espace comme disponible pour une utilisation par la base de données, un processus sous vide doit se produire derrière les opérations et marquer cet espace disponible pour la base de données à utiliser. Cependant, il n'est pas retourné au système d'exploitation. Cela se produit uniquement lorsqu'il n'y a pas de lignes actives dans une page entière, ce qui peut être rare dans certaines charges de travail. Cela peut être une bonne chose pour certaines charges de travail, car vous pouvez simplement mettre à jour l'espace sur les pages individuelles à l'intérieur des fichiers de données, sans avoir besoin d'ajouter des fichiers de données supplémentaires.
Les problèmes surviennent avec le ballonnement lorsqu'il y a un nombre excessivement élevé de tuples morts par rapport à des tuples vivants. Marcher et vérifier tous les indicateurs de visibilité prend du temps et avoir plus de fichiers de données pour une relation entraîne une charge d'E / S supplémentaire inutile. Le ballonnement est particulièrement visible sur les index, qui peuvent également avoir de nombreux tuples morts, parfois beaucoup plus que la table. Le ballonnement peut ralentir les recherches et les analyses d'index, ce qui se traduira par une augmentation lente des temps de requête et une modification des plans de requête.
Vous pouvez restaurer l' espace en utilisant pg_reorg , pg_repack , CLUSTER
ou VACUUM FULL
. Cela va parcourir et réorganiser les fichiers, déplacer les tuples et réorganiser pour s'assurer qu'il n'y a pas de tuples morts, ce qui éliminera le ballonnement.
Le gonflement peut également être géré efficacement en ajustant les VACUUM
paramètres par table, ce qui marque l'espace de tuple mort disponible pour une réutilisation par les requêtes suivantes.
Vous pouvez utiliser des requêtes sur le wiki PostgreSQL relatives à Show Database Bloat et Index Bloat pour déterminer la quantité de ballonnement que vous avez, et à partir de là, faire un peu d'analyse des performances pour voir si vous avez des problèmes avec la quantité de ballonnement que vous avez sur vos tables .