Comment dupliquer un immense tableau PostgreSQL?

29

J'ai une énorme table postgres (10 Go de données - 160 millions d'enregistrements). La table est statique et aucune opération d'écriture n'y est effectuée. Je veux le dupliquer, effectuer des écritures, le réindexer, puis avec une seule transaction rapide, supprimer l'ancien et renommer le nouveau en nom d'origine.

Quel est le moyen le plus rapide de dupliquer une table aussi énorme?

Milovan Zogovic
la source

Réponses:

55

Généralement, le moyen le plus rapide de dupliquer une table est simplement:

CREATE TABLE table2 AS SELECT * FROM table1;

Les INSERT parallèles peuvent être plus rapides, mais uniquement avec un sous-système de disque très rapide (lorsque les données sont entrelacées sur de nombreux lecteurs). Sinon, ce sera plus lent.

Une fois la modification terminée table2, il peut prendre le nouveau nom avec:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

La DROP TABLEcommande a besoin d'un verrou exclusif, qui affecte les lecteurs simultanés d'une manière que vous souhaiterez peut-être anticiper:

  • DROP attendra la fin de toute lecture en attente sur la table des autres transactions.
  • Toute nouvelle transaction tentant de lire cette table entre-temps sera mise en attente, puis échouera car l'original table1n'existe plus. L'erreur ressemblerait « pourrait relation ouverte avec pas OID oid »

Pour éviter le deuxième problème, vous pouvez renommer table1 au old_table1 lieu de le supprimer, puis le supprimer uniquement plus tard en dehors de la transaction, lorsque ces lecteurs en auront terminé. Ainsi, la séquence ci-dessus deviendrait:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;
Daniel Vérité
la source
2
Merci mec. C'est exactement le genre d'explication que je cherchais. Merci encore!
Milovan Zogovic
Si des index sont définis sur table2, fonctionneront-ils toujours une fois la table renommée?
BamaPookie
1
@BamaPookie consultez ceci pour le schéma complet, y compris les index, les contraintes et les valeurs par
Timothy Vogel