Dois-je RÉINDEXER ET ASPIRER une table après avoir supprimé de nombreuses lignes?

10

J'exécute une base de données PostgreSQL qui a plusieurs tables qui stockent des informations de journalisation. Ces informations sont fournies à des fins de rapport uniquement et sont transférées dans un fichier et supprimées de la base de données si elles datent de plus de 30 jours.

Il peut y avoir des millions de lignes supprimées, et nous avons exécuté un REINDEX à chaque fois après la suppression.

Est-ce suffisant, ou devrions-nous également exécuter un VIDE ou ANALYSER LE VIDE? Ou le REINDEX n'est-il pas nécessaire et devrions-nous simplement exécuter un VIDE ou ANALYSER LE VIDE?

Nous utilisons PostgreSQL 8.2.3, qui, je crois, ne permet pas la mise sous vide automatique.

cowgod
la source
2
Vous voudrez peut-être envisager le partitionnement, voir postgresql.org/docs/9.0/static/ddl-partitioning.html ; alors vous pouvez simplement déposer des partitions et éviter de passer l'aspirateur.
alex
3
La version 8.2.3 a auto_vacuum, voir le manuel, mais vous devez mettre à jour dès que possible. La version 8.2 actuelle est la 8.2.17. Vous avez 14 correctifs derrière, dont deux correctifs de sécurité. Une mise à niveau vers 8.4 ou même 9.0 est une meilleure idée, auto_vacuum a été amélioré.
Frank Heikens

Réponses:

13

Vous devez effectuer une ANALYSE DU VIDE, car le VIDE permettra la réutilisation de l'espace utilisé par les données supprimées et empêchera le bouclage des transactions, et l'ANALYSE mettra à jour les statistiques du planificateur, ce qui devrait conduire à de meilleurs plans de requête pour vos requêtes de rapport.

Un REINDEX n'est pas théoriquement requis, mais vous pouvez constater qu'il en résulte de meilleures performances car l'index est contigu.

Les pages de documentation pertinentes pour 8.2 sont ici (réindexation de routine) et ici (aspiration de routine) .

hmallett
la source