Sollte ich VACUUM in der Transaktion oder danach ausführen?

8

Ich habe einen Synchronisierungsprozess für mobile Anwendungen. Die Transaktion nimmt viele Änderungen an der Datenbank vor. Da dies auf Mobilgeräten durchgeführt wird, muss ich einen VACUUM ausgeben, um die Datenbank zu komprimieren.

Ich frage mich, wann ich einen VACUUM ausgeben sollte

  • in der Transaktion als abschließende Anweisung
  • oder nach der Transaktion?

Ich suche derzeit nach SQLite, aber wenn es für andere Engines anders ist, lassen Sie es mich in den Antworten wissen (PostgreSQL, MySQL, Oracle, SQLServer)

    
Pentium10 12.02.2010, 08:32
quelle

4 Antworten

4

Ich würde sagen, außerhalb der Transaktion. Sicher in PostgreSQL ist VACUUM entworfen, um die "toten" Tupel zu entfernen (d. H. Die alte Zeile, wenn ein Datensatz geändert oder gelöscht wurde.)

Wenn Sie VACUUM in einer Transaktion ausführen, die Datensätze geändert hat, wurden diese toten Zeilen nicht zum Löschen markiert.

Je nachdem, welche Art von VACUUM Sie verwenden, kann auch eine Tabellensperre erforderlich sein, die blockiert, wenn andere Transaktionen ausgeführt werden, sodass Sie möglicherweise in eine Deadlock-Situation geraten (Transaktion 1 ist auf eine Tabelle wartend blockiert) Sperren, um seine VACUUM zu tun, wird Transaktion 2 blockiert, warten auf eine Zeile freigegeben werden, dass Transaktion 1 gesperrt hat.)

Ich würde auch empfehlen, dass dies in einer Anwendung nicht erledigt wird (vielleicht als eine geplante Aufgabe), da es eine Weile dauern kann, bis sie abgeschlossen ist und sich negativ auf die Geschwindigkeit anderer Abfragen auswirken kann.

Wie bei SQL Server gibt es kein VACUUM - was Sie suchen, ist "verkleinern". Sie können die automatische Verkleinerung im Jahr 2005 aktivieren, die automatisch Speicherplatz zurückfordert, wenn der Server entscheidet, oder eine DBCC-Anweisung zum Verkleinern der Datenbank und der Protokolldatei ausstellen. Dies hängt jedoch von Ihrer Sicherungsroutine und -strategie auf Datenbankebene ab. p>     

Andy Shellam 12.02.2010, 08:39
quelle
13

Wenn Sie PostgreSQL verwenden oder nicht, können Sie nicht VACUUM in der Transaktion ausführen, wie in Handbuch :

  

VACUUM kann nicht innerhalb eines Transaktionsblocks ausgeführt werden.

    
Milen A. Radev 12.02.2010 10:26
quelle
1

Vakuum ist wie Defragmentieren, es ist gut zu tun, wenn Sie vor kurzem viele Dinge gelöscht haben, oder vielleicht nachdem Sie eine Menge Zeug eingefügt haben, aber auf keinen Fall sollten Sie es bei jeder Transaktion tun. Es ist langsamer als fast jeder andere Datenbankbefehl und ist eher eine Wartungsaufgabe.

Wir fügen manchmal den Großteil unserer db-Datei hinzu oder entfernen sie, also wäre ein Vakuum eine gute Idee, aber ich würde es immer noch nicht als Teil derselben Transaktion betrachten, die die Arbeit erledigt hat.

    
Karl 12.02.2010 08:35
quelle
0

Wie oft wird die Transaktion ausgeführt?

Es ist wirklich eine tägliche Art von Prozess nicht eine Abfrage nach Abfrage-Prozess, aber wenn Sie es ohne voll verwenden, dann kann es in einer Transaktion verwendet werden, da es keine Sperre erhält.

Wenn Sie es tun, sollte es außerhalb der Transaktion sein, da es unabhängig von der Datenintegrität der Transaktionen ist.

    
Paul Creasey 12.02.2010 08:38
quelle

Tags und Links