Mise à jour TRÈS GRANDE base de données PostgreSQL table efficacement

J'ai une très grande table de base de données PostgresQL et une colonne comme "copié". Chaque nouvelle ligne commence uncopied et sera plus tard être répliqué à autre chose par un arrière-plan programm. Il y a un index partiel sur la table "btree(ID) OÙ répliqué=0". L'arrière-plan programm fait une sélection de plus de 2000 entrées (LIMITE de 2000), la travaille et puis valide les modifications en une seule opération à l'aide de 2000 sql préparée-commandes.

Maintenant, le problème ist que je veux donner à l'utilisateur une option pour réinitialiser ce répliqué-valeur, faites tout de zéro à nouveau.

Une mise à jour de la table de jeu répliqué=0;

n'est pas possible:

  • Il prend beaucoup de temps
  • Il double la taille de la table en raison de MVCC
  • C'est fait en une seule transaction: Elle manque ou passe à travers.

Je n'ai absolument pas besoin de la transaction de fonctionnalités pour ce cas: Si le système tombe en panne, il doit la traiter seulement des parties.

Plusieurs autres problèmes:
Faire un

update set replicated=0 where id >10000 and id<20000

est aussi mauvais: Il fait un balayage séquentiel de tous sur l'ensemble de la table qui est trop lent.
Si elle ne le faisaient pas, il serait toujours lent, car il serait trop cherche.

Ce que j'ai vraiment besoin, c'est une manière de passer à travers toutes les lignes, de les changer et de ne pas être lié à un géant de la transaction.

Étrange, un

UPDATE table 
  SET replicated=0 
WHERE ID in (SELECT id from table WHERE replicated= LIMIT 10000)

est aussi lent, mais il devrait être une bonne chose: Passer par la table de DISQUE...

(Notez que dans ce cas, il y a également un indice qui a couvert ce)

(Une mise à jour LIMITE comme Mysql n'est pas disponible pour PostgresQL)

BTW: Le vrai problème est plus compliqué et que nous parlons d'un système embarqué qui est déjà en place, à distance des modifications de schéma est difficile, mais possible
C'est PostgresQL 7.4 malheureusement.

Le nombre de lignes dont je parle, par exemple, 90000000. La taille de la databse peuvent être de plusieurs dozend gigaoctets.

La base de données elle-même ne contient que 5 tables, l'une est un très gros.
Mais ce n'est pas une mauvaise conception, parce que ces boîtes de fonctionner uniquement avec un type d'entité, ce n'est pas un système ERP ou quelque chose comme ça!

Des idées?

OriginalL'auteur Christian | 2008-09-21