im laufenden Betrieb größere Datenmengen löschen

Hallo,

bin eher Anfänger auf dem Gebiete Datenbanken/postgresql (speziell was WARTUNG und OPTIMIERUNG angeht :smiley: ), aber brauche mal Rat…

mag sein dass das jetzt etwas allgemein klingt, aber…

habe eine Anwendung, Java EE 6, wo Postgresql mittels JPA/Hibernate genutzt wird.

Dort gibts mehrere Tabellen, wo der Zugriff auf die Daten direkt per Primärschlüssel stattfindet, keinerlei selects. Der Primärschlüssel eines Datensatzes wird programmintern aus mehreren Kennwerten berechnet so dass jede Zeile direkt und schnell gefunden wird (64 bit longint). Jede Tabelle besteht aus einer “handvoll” Spalten und zwischen mehreren tausend und einer Million Zeilen (so in etwa).

Da Postgresql ja offenbar direkt einen Index über den Primärschlüssel anlegt, funktioniert der Zugriff sehr schnell, die Anwendung läuft grundsätzlich gut.

Meine Frage ist nun - es wird nun manchmal notwendig größere Mengen Daten aus diesen Tabellen zu löschen, also sagen wir mal, auf einmal einen Block aus 50.000 Zeilen pro Tabelle (die Daten sind “Projekten” zugeordnet und ab und an ist ein Projekt abgeschlossen und soll aus der Datenbank entfernt werden).

Die Fragen dazu sind

  • muss, nachdem so ein Löschvorgang stattgefunden hat, irgendein Wartungsvorgang stattfinden? Aufräumen, defragmentieren etc.?
  • ist es notwendig, die Erzeugung des Index irgendwie neu anzuregen/steuern, damit der optimiert wird (dürfte sich ja intern um einen Binärbaum handeln)
  • kann so ein Löschvorgang mitten im laufenden Betrieb stattfinden ohne dass parallel laufende Zugriffen (lesen und auch schreiben) auf dieselben Tabellen weitgehend ohne Performance-Verlust stattfinden können oder sollte man so eine Aktion “Projekt löschen und danach Datenbank warten” lieber auf die Nachstunden, wenn wenig los ist, verschieben?

Tjo, wäre dankbar über Antworten…

Gruß.

Nicht unbedingt, Postgres wird irgendwann vernünftig aufräumen.
Schaden kann aber ein “vacuum analyze” danach nicht. Details dazu sind im Handbuch: https://www.postgresql.org/docs/current/static/routine-vacuuming.html

Nein, da muss man nichts machen. Das passiert automatisch.

Das hängt alles von der Hardware ab. Wenn die Festplatte(n) schnell genug sind, sollte das kein Problem sein, vor allem wenn es nur 50.000 Datensätze sind. Natürlich beeinflusst das die Performance des restlichen Systems, aber das sollte sich in Grenzen halten mit halbwegs vernünftiger Hardware.

Danke. Klingt bisschen nach “einfach mal ausprobieren”. Werd ich dann wohl mal tun.

Ja. Und das System auch beobachten. Wenn Autovacuum nicht hinterher kommt dann hast Du irgentwann mal bloat in den Tabellen und Indexen. Also es gibt schon so einige Parameter, die man bei größeren Dingen beachten & beobachten sollte. Aber im allgemeinen macht das PG schon alles recht smart selbst.