web-dev-qa-db-fra.com

PostgreSQL "taille des fichiers temporaires"

J'ai importé des données dans une nouvelle base de données (environ 600 millions de lignes d'horodatage, entier, double). J'ai ensuite créé quelques index et essayé de modifier certaines colonnes (en raison de problèmes d'espace), la base de données est vide.

Maintenant pgAdmin III me dit que la " taille des fichiers temporaires " est 50G ~ +.

  1. Quels sont ces fichiers temporaires? sont-ils comme le journal des transactions SQL Server?
  2. Comment puis-je m'en débarrasser, il semble que la base de données soit beaucoup plus grande qu'elle ne devrait (la taille totale de la base de données est de 91 Go)

Utilisation de Posgres 9.4.1 sur un serveur Windows 2012.

Une capture d'écran de l'onglet Statistiques de la base de données:

A screenshot of the database statistics tab

13
Ofiris

Je n'ai rien trouvé dans la documentation de pgAdmin, mais le le code source révèle la requête derrière ces entrées (ajoutée pour Postgres 9.2+):

Cela se résume à:

SELECT temp_files AS "Temporary files"
     , temp_bytes AS "Size of temporary files"
FROM   pg_stat_database db;

Et le le manuel Postgres contient des détails sur pg_stat_database :

tmp_filesbigint Nombre de fichiers temporaires créés par des requêtes dans cette base de données. Tous les fichiers temporaires sont comptés, quelle que soit la raison pour laquelle le fichier temporaire a été créé (par exemple, le tri ou le hachage) et quel que soit le paramètre log_temp_files .

temp_bytesbigint Quantité totale de données écrites dans des fichiers temporaires par des requêtes dans cette base de données. Tous les fichiers temporaires sont comptés, quelle que soit la raison pour laquelle le fichier temporaire a été créé et quel que soit le paramètre log_temp_files .

Notez que ces valeurs pas contribuent à la taille de votre base de données. Mais ils indiquent que votre paramètre pour work_mem peut être trop faible, de sorte que de nombreuses opérations de tri se déversent sur le disque (ce qui est très lent par rapport à la seule RAM).

En relation:

Pour réellement compacter la taille de votre base de données:

Pour mesurer la taille:

Mis à part: [~ # ~] wal [~ # ~] (Write Ahead Log) serait équivalent en PostgreSQL pour le journal des transactions dans SQL Server. Belle explication dans cette réponse connexe sur SO:

12
Erwin Brandstetter

Selon:

http://www.postgresql.org/message-id/[email protected]

Le compteur temporaire (fichiers et espace utilisé) affiche un total de tous les fichiers temporaires utilisés depuis probablement la création du cluster. Il ne reflète pas l'espace actuel utilisé par les fichiers temporaires.

Mon système, par exemple, affiche près de 700 Go de fichiers temporaires utilisés, mais l'espace réel occupé par les fichiers temporaires dans /var/lib/pgsql/9.3/data/base/pgsql_tmp n'est actuellement que de 53 Mo.

10
Eduard Rozenberg