Primary key nachträglich erstellen für sehr grosse Tabelle

Hallo,

Ich habe eine etwas spezielle Frage. ich habe eine Tabelle mit sehr vielen Daten (etwa 8,5 Mio Rows). Ich habe die Tabelle aus einer anderen DB nach Postgres kopiert. Leider ging aus irgendeinem Grund beim kopieren der Primärschlüssel verloren. Nun habe ich versucht einfach den Schlüssel nachträglich mit Hilfe von ügAdmin3 wieder zu erstellen. Hierbei bekommen ich (vermutlich aufgrund der grosse Datenmenge) immer einen Fehler wegen zu wenig Speicherplatz angezeigt.

HINWEIS: ALTER TABLE / ADD PRIMARY KEY erstellt implizit einen Index »pk_trip_all« für Tabelle »trip_all«
FEHLER: Speicher aufgebraucht
DETAIL: Fehler bei Anfrage mit Größe 268435456.

********** Error **********

FEHLER: Speicher aufgebraucht
SQL state: 53200
Detail: Fehler bei Anfrage mit Größe 268435456.

Hat jemand eine Idee wie ich den Schlüssel angelegt bekomme?
Ich habe schon in der postgresql.conf datei die Einträge für shared_buffers und work_mem auf 120000MB erhöht, wobei ich zugeben muss, dass ich nicht so genau weiss was das bewirkt. Aber es geht trotzdem nicht.

Wer hat einen Tipp und kann mir helfen?

Vielen Dank schon einmal für die Hilfe

Gruss
Hanno

maintenance_work_mem ist Dein Freund. Stelle bitte work_mem wieder auf einen ‘normalen’ Wert, selbst auf einem gut ausgebauten System wäre 120 GByte a bissl arg viel. Wieviel RAM hat die Maschine? Ich würde maintenance_work_mem erst mal auf so 512MByte stellen.


Andreas

Hallo,

Ich bin immer wieder begeistert wie schnell man hier eine Antwort bekommt. Danke dafür und weiter so.

Der Server hat 3GB RAM.
Ich habe jetzt einmal die Einstellung für maintenance_work_mem angepasst. Nun scheint es zu gehen. Wenigstens bekomme ich keine fehlermeldung mehr, allerdings dauert das jetzt ewig und ich bin nicht sicher ob das Ergebnis noch kommt, da es immer noch rechnet. Heisst das jetzt, wenn man “zuviel MB” in der postgresql.conf für maintenance_work_mem angibt, dann läuft es auf einen Fehler? Weiss jetzt gerade nicht warum es funktioniert wenn ich weniger anstatt mehr angebe.

Jetzt noch eine weitere Frage, die für euch wahrscheinlich sehr einfach ist. Wie kann ich abfragen ob die Werte in einer Spalte wirklich unique sind, also nicht doppelt vorkommen?

Gruss
Hanno



SELECT die_spalte, count(*)
FROM der_tabelle
GROUP BY die_spalte
HAVING count(*) > 1

Zeigt alle mehrfachen Werte an.

maintenance_work_mem ist der Speicherbereich, der für solche Operationen benutzt wird, work_mem ist was anderes, und shared_buffers wieder was anderes. Warum warst Du nicht zur PGConf, wenn Dich das interessiert? :wink: Also, gib die Begriffe mal in Google ein, das ist alles recht gut dokumentiert und oft genug diskutiert.


Jetzt noch eine weitere Frage, die für euch wahrscheinlich sehr einfach ist. Wie kann ich abfragen ob die Werte in einer Spalte wirklich unique sind, also nicht doppelt vorkommen?

Gruss
Hanno

siehe castorp


Andreas