Verwendung von PG 9.1 unter Ubuntu 12.04.
Derzeit dauert es bis zu 24 Stunden, bis wir eine große Anzahl von UPDATE-Anweisungen in einer Datenbank ausgeführt haben, die folgende Form haben:
UPDATE table
SET field1 = constant1, field2 = constant2, ...
WHERE id = constid
(Wir überschreiben nur Felder von Objekten, die durch ID gekennzeichnet sind.) Die Werte stammen aus einer externen Datenquelle (nicht bereits in der Datenbank in einer Tabelle).
Die Tabellen haben jeweils eine Handvoll Indizes und keine Fremdschlüsseleinschränkungen. Bis zum Ende wird kein COMMIT durchgeführt.
Es dauert 2 Stunden, um eine pg_dump
der gesamten DB zu importieren . Dies scheint eine Grundlinie zu sein, auf die wir angemessen zielen sollten.
Abgesehen von der Erstellung eines benutzerdefinierten Programms, das einen Datensatz für den erneuten Import von PostgreSQL auf irgendeine Weise rekonstruiert, können wir noch etwas tun, um die UPDATE-Massenleistung näher an die des Imports heranzuführen? (Dies ist ein Bereich, der unserer Meinung nach mit logarithmisch strukturierten Zusammenführungsbäumen gut zurechtkommt, aber wir fragen uns, ob wir in PostgreSQL etwas tun können.)
Einige Ideen:
- Alle Nicht-ID-Indizes löschen und danach neu erstellen?
- Steigern Sie checkpoint_segments, aber hilft dies tatsächlich, den Durchsatz langfristig aufrechtzuerhalten?
- Verwenden Sie die hier genannten Techniken ? (Neue Daten als Tabelle laden, dann alte Daten "zusammenführen", wobei ID in neuen Daten nicht gefunden wird.)
Grundsätzlich gibt es eine Menge Dinge zu versuchen und wir sind uns nicht sicher, welche am effektivsten sind oder ob wir andere Dinge übersehen. Wir werden die nächsten Tage damit verbringen, zu experimentieren, aber wir dachten, wir würden auch hier nachfragen.
Die Tabelle ist zwar gleichzeitig geladen, aber schreibgeschützt.
explain analyze
ob ein Index für die Suche verwendet wird.