2009-04-02 9 views
21

Ich habe ein Dienstprogramm in meiner Anwendung, wo ich Massenbelastung von INSERT, UPDATE & DELETE Operationen durchführen muss. Ich versuche, eine Transaktion um diese herum zu erstellen, so dass, wenn dieses System einmal aufgerufen ist und die Daten ihm zugeführt werden, sichergestellt ist, dass es entweder ganz oder gar nicht zur Datenbank hinzugefügt wird.Maximale Transaktionsgröße in PostgreSQL

Die Sorge, was ist, was sind die Randbedingungen hier? Wie viele INSERT, UPDATE & DELETE kann ich in einer Transaktion haben? Ist die Transaktionsgröße konfigurierbar?

Jede Hilfe wäre willkommen.

-Danke

Antwort

18

Ich glaube nicht, dass es eine maximale Menge an Arbeit ist, die in einer Transaktion ausgeführt werden können. Daten werden immer zu den Tabellendateien hinzugefügt, und die Transaktion wird schließlich entweder bestätigt oder zurückgesetzt: AIUI Dieses Ergebnis wird in pg_clog gespeichert. Wenn es zurückrollt, wird der Raum schließlich durch Vakuum zurückgewonnen. Es ist also nicht so, dass die laufende Transaktionsarbeit zum Beispiel im Speicher gehalten und zur Commit-Zeit gelöscht wird.

+14

Dies ist nur teilweise korrekt. Innerhalb jeder Transaktion befindet sich ein Befehlszähler, der sich mit der Sichtbarkeit innerhalb der Transaktion befasst. Dies ist eine 32-Bit-Nummer, die bei einer sehr großen Transaktion (Milliarden von Befehlen) schließlich überläuft. VACUUM, pg_clog usw. behandelt nur die Gesamtzahl der Transaktionen im System, nicht was in einem von ihnen passiert. –

+0

@MagnusHagander Stimmt diese 32-Bit-Zahl immer noch? Wurde diese Nummer auf 64-Bit aktualisiert? – Kuberchaun

+0

Ja, der interne Befehlszähler ist immer noch 32 Bit. –

16

Für ein Projekt, an dem ich arbeite, führe ich 20 Millionen INSERT aus. Ich habe es mit einer großen Transaktion und mit einer Transaktion pro Million INSERT versucht und die Leistungen scheinen genau gleich zu sein.

PostgreSQL 8.3

+1

War das System lokal? Ich denke, dass bei einem System, bei dem die Latenz ein Faktor ist, die Leistung unterschiedlich ist. – user2677679

0

Ich glaube, die maximale Menge an Arbeit, indem Sie Ihre Protokolldateigröße begrenzt ist. Die Datenbank wird sich niemals erlauben, ein Rollback durchzuführen. Wenn Sie also während der Transaktion Ihren gesamten Protokollspeicherplatz verbrauchen, wird er angehalten, bis Sie ihm mehr Speicherplatz oder ein Rollback geben. Dies gilt generell für alle Datenbanken.

Ich würde empfehlen, Ihre Updates in verwaltbare Chunks zu zerlegen, die ein paar Minuten Ausführungszeit benötigen, auf diese Weise wissen Sie, ob es früher ein Problem gibt (zB was normalerweise 1 Minute dauert nach 10 Minuten noch läuft ...) hmmm, hat jemand einen Index fallen lassen?)

+8

Dies gilt nicht für PostgreSQL. Wir können Protokollspeicher während einer laufenden Transaktion wiederverwenden. Wenn Sie eine Archivprotokollierung durchführen, benötigen Sie natürlich Speicherplatz am Speicherort des Archivs, für das lokale Transaktionslog ist dies jedoch nicht erforderlich. (Sie benötigen natürlich den tatsächlichen Speicherplatz für die Daten auf der Festplatte). –

18

Eine einzige Transaktion kann ungefähr zwei Milliarden Befehle ausführen (2^31, minus IIRC ein kleines bisschen Overhead. Eigentlich, um darüber nachzudenken, das kann 2^sein 32 - der Kommandozähler ist unsigniert, denke ich).

Jeder dieser Befehle kann natürlich mehrere Zeilen ändern.