2010-06-21 3 views
0

J'ai créé un ensemble de tables partitionnées dans Postgres et j'ai commencé à insérer beaucoup de lignes via la table principale. Lorsque le processus de chargement a explosé sur moi, je me suis rendu compte que j'aurais dû déclarer la ligne d'identification BIGSERIAL (BIGINT avec une séquence, dans les coulisses), mais l'ai par inadvertance définie comme SERIAL (INTEGER). Maintenant que j'ai quelques milliards de lignes chargées, j'essaye de modifier la colonne en BIGINT. Le processus semble fonctionner, mais prend beaucoup de temps. Donc, en réalité, je ne sais pas vraiment si ça marche ou si c'est accroché. Je préfère ne pas recommencer tout le processus de chargement.Comment modifier un ensemble de tables partitionnées dans Postgres?

Des suggestions?

Répondre

0

Redémarrer (clarifier l'édition: redémarrer tout le processus de chargement à nouveau).

La modification d'une valeur de colonne nécessite une nouvelle version de ligne et tous les index pointant vers l'ancienne version doivent être mis à jour pour pointer vers la nouvelle version.

En outre, voir combien de advise on populating databases vous pouvez suivre.


Correction de @archnid:

en train de modifier le type de la colonne déclenche une ré-écriture de la table, de sorte que le versioning de ligne n'est pas un gros problème, mais il faudra encore beaucoup d'espace disque temporairement. vous pouvez généralement suivre les progrès en regardant quels sont les fichiers dans le répertoire de base de données sont en annexe à ...

+0

ok. Je ne suis pas clair à partir de votre réponse si vous suggérer je redémarre le serveur, ou je refais l'ensemble du processus de chargement de données. Est-ce que vous suggérez que je recharge la base de données, puisque ALTER la table principale prendra environ le même temps de toute façon? – punkish

+0

J'aurais aussi dû ajouter ... Je n'ai aucun index sur la table, pas même une clé primaire. – punkish

+0

Je vous suggère de refaire tout le processus de chargement, puisque la modification de la table prendra beaucoup plus de temps. Cependant, ne pas avoir d'index supprime l'un des plus gros problèmes avec les mises à jour massives. Le problème restant est que vous aurez besoin de deux fois l'espace disque, puis une fois terminé, la moitié de votre table sera vide. Je n'ai pas d'expérience récente avec de grandes tables * inherited *, donc je ne sais pas comment cela influence la décision. –

1

Lorsque vous mettez à jour une ligne à modifier dans PostgreSQL, qui écrit une nouvelle copie de la ligne et ne un peu de nettoyage plus tard pour supprimer l'original. Cela signifie que tenter de résoudre le problème en effectuant des mises à jour peut prendre plus de temps que le chargement de toutes les données: il s'agit plus d'E/S disque que de chargement d'une nouvelle copie et de temps de traitement supplémentaire. La seule situation où vous voudriez faire une mise à jour au lieu d'un rechargement est quand la charge originale était très inefficace, par exemple si un programme lent de client insère les données et c'est le goulot d'étranglement sur le processus. Pour savoir si le processus fonctionne encore, vérifiez s'il utilise le processeur lorsque vous exécutez le haut (systèmes UNIX) ou le gestionnaire des tâches (Windows). Sous Linux, "top -c" vous montrera ce que font les processus du client PostgreSQL. Vous vous attendez probablement à ce que cela prenne moins de temps que le chargement d'origine, ce qui ne sera pas le cas, et il fonctionne toujours plutôt que de raccrocher.

Questions connexes