Ich habe zwei Datenbanktabellen. Eine enthält Hunderte von Millionen von Datensätzen. Nennen wir das mal history
. Der andere wird täglich berechnet und ich möchte alle seine Datensätze in den history
einen kopieren .
Was ich getan habe war zu rennen:
INSERT INTO history SELECT * FROM daily
Und es hat eine Weile geklappt, aber es wurde langsamer und langsamer, als die Anzahl der Rekorde immer größer wurde. Jetzt habe ich ungefähr 2 Millionen Datensätze, die in einem Arbeitsgang von daily
nach kopiert werden müssen, history
und die Fertigstellung dauert zu lange.
Gibt es eine andere, effizientere Möglichkeit, Daten von einer Tabelle in eine andere zu kopieren?
quelle
Sichern Sie die Tabelle im CSV-Format
Verwenden Sie den Befehl COPY, der für große Datenmengen weitaus effizienter ist.
Weitere Informationen finden Sie in den Postgres-Dokumenten unter http://www.postgresql.org/docs/current/static/sql-copy.html
quelle
history
Tabelle enthält 160 Millionen Zeilen , und wir fügen drei weitere Millionen Zeilen hinzu.Das Problem war mit Indizes. Die
history
Tabelle hatte 160 Millionen indizierte Zeilen. Durch Ausführen von entwederCOPY FROM
oderINSERT INTO .. SELECT
dauerte es viel Zeit, keine Zeilen einzufügen, sondern Indizes zu aktualisieren. Wenn ich Indizes deaktivierte, importierte es 3M Zeilen in 10 Sekunden. Jetzt muss ich einen schnelleren Weg finden, um den großen Tisch neu zu indizieren.quelle
Sie können psql- Tool verwenden, ich könnte effizient sein, wie die folgenden,
Sie können auch ein Shell-Skript schreiben.
quelle
Dies ist natürlich keine exakte Antwort auf Ihre Frage, aber wenn Sie nicht auf die
history
Tabelle zugreifen müssen , können Sie auch einen SQL-Dump generieren:Dann könnte man mit einem Tool gerne
git
die Differenz berechnen und diese effizient speichern.Dies ist nützlich, da sich die meisten Teile in einer Datenbank nicht jeden Tag ändern. Anstatt für jeden Tag eine vollständige Kopie zu speichern, kann die Differenz zwischen zwei Tagen gespeichert werden.
Sie können einen
crontab
Job so verwenden, dass der Dump jeden Tag verarbeitet wird.quelle