HAFTUNGSAUSSCHLUSS: Diese Frage ähnelt der Frage zum Stapelüberlauf hier , aber keine dieser Antworten funktioniert für mein Problem, wie ich später erläutern werde.
Ich versuche, eine große Tabelle (~ 40 Millionen Zeilen, mehr als 100 Spalten) in Postgres zu kopieren, in der viele Spalten indiziert sind. Derzeit verwende ich dieses SQL-Bit:
CREATE TABLE <tablename>_copy (LIKE <tablename> INCLUDING ALL);
INSERT INTO <tablename>_copy SELECT * FROM <tablename>;
Diese Methode hat zwei Probleme:
- Es fügt die Indizes vor der Datenaufnahme hinzu, sodass es viel länger dauert, als die Tabelle ohne Indizes zu erstellen und nach dem Kopieren aller Daten zu indizieren.
- Dadurch werden Spalten im SERIAL-Stil nicht ordnungsgemäß kopiert. Anstatt einen neuen 'Zähler' für die neue Tabelle einzurichten, wird der Standardwert der Spalte in der neuen Tabelle auf den Zähler der letzten Tabelle gesetzt, was bedeutet, dass er beim Hinzufügen von Zeilen nicht erhöht wird.
Die Tabellengröße macht die Indizierung zu einem Echtzeitproblem. Es macht es auch unmöglich, in eine Datei zu kopieren, um sie dann erneut aufzunehmen. Ich habe auch nicht den Vorteil einer Kommandozeile. Ich muss dies in SQL tun.
Was ich tun möchte, ist entweder direkt eine exakte Kopie mit einem Wunderbefehl zu erstellen oder, wenn dies nicht möglich ist, die Tabelle mit allen Einschränkungen, aber ohne Indizes, zu kopieren und sicherzustellen, dass es sich um die Einschränkungen "im Geiste" handelt (auch bekannt als) einen neuen Zähler für eine SERIAL-Spalte). Kopieren Sie dann alle Daten mit a SELECT *
und kopieren Sie dann alle Indizes.
Quellen
Frage zum Stapelüberlauf beim Kopieren von Datenbanken : Dies ist aus drei Gründen nicht das, wonach ich frage
- Es verwendet die Befehlszeilenoption
pg_dump -t x2 | sed 's/x2/x3/g' | psql
und in dieser Einstellung habe ich keinen Zugriff auf die Befehlszeile - Es werden die Indizes vor der Datenaufnahme erstellt, was langsam ist
- Es aktualisiert die seriellen Spalten nicht korrekt als Beweis von
default nextval('x1_id_seq'::regclass)
- Es verwendet die Befehlszeilenoption
Methode zum Zurücksetzen des Sequenzwerts für eine Postgres-Tabelle : Das ist großartig, aber leider sehr manuell.