Ich arbeite an einem Projekt, bei dem Daten aus Messdateien in eine Posgres 9.3.5-Datenbank analysiert werden.
Im Kern befindet sich eine Tabelle (unterteilt nach Monat), die für jeden Messpunkt eine Zeile enthält:
CREATE TABLE "tblReadings2013-10-01"
(
-- Inherited from table "tblReadings_master": "sessionID" integer NOT NULL,
-- Inherited from table "tblReadings_master": "fieldSerialID" integer NOT NULL,
-- Inherited from table "tblReadings_master": "timeStamp" timestamp without time zone NOT NULL,
-- Inherited from table "tblReadings_master": value double precision NOT NULL,
CONSTRAINT "tblReadings2013-10-01_readingPK" PRIMARY KEY ("sessionID", "fieldSerialID", "timeStamp"),
CONSTRAINT "tblReadings2013-10-01_fieldSerialFK" FOREIGN KEY ("fieldSerialID")
REFERENCES "tblFields" ("fieldSerial") MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT "tblReadings2013-10-01_sessionFK" FOREIGN KEY ("sessionID")
REFERENCES "tblSessions" ("sessionID") MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT "tblReadings2013-10-01_timeStamp_check" CHECK ("timeStamp" >= '2013-10-01 00:00:00'::timestamp without time zone AND "timeStamp" < '2013-11-01 00:00:00'::timestamp without time zone)
)
Wir sind dabei, die Tabelle mit Daten zu füllen, die bereits gesammelt wurden. Jede Datei repräsentiert eine Transaktion von rund 48.000 Punkten und es gibt mehrere tausend Dateien. Sie werden mit einem importiertINSERT INTO "tblReadings_master" VALUES (?,?,?,?);
Anfänglich werden die Dateien mit einer Geschwindigkeit von mehr als 1000 Einfügungen / Sek. Importiert, aber nach einer Weile (eine inkonsistente Menge, aber niemals länger als 30 Minuten oder so) sinkt diese Rate auf 10-40 Einfügungen / Sek. Und der Postgres-Prozess schaltet eine CPU. Die einzige Möglichkeit, die ursprünglichen Raten wiederherzustellen, besteht darin, ein vollständiges Vakuum durchzuführen und zu analysieren. Dadurch werden letztendlich etwa 1.000.000.000 Zeilen pro Monatstabelle gespeichert, sodass das Vakuum einige Zeit in Anspruch nimmt.
BEARBEITEN: Hier ist ein Beispiel, in dem es einige Zeit für kleinere Dateien ausgeführt wurde und nach dem Start größerer Dateien fehlgeschlagen ist. Die größeren Dateien sehen unberechenbarer aus, aber ich denke, das liegt daran, dass die Transaktion erst am Ende einer Datei festgeschrieben wird, etwa 40 Sekunden.
Es wird ein Web-Frontend geben, das einige Elemente auswählt, aber keine Aktualisierungen oder Löschungen vornimmt. Dies wird ohne andere aktive Verbindungen angezeigt.
Meine Fragen sind:
- Wie können wir feststellen, was die Verlangsamung / Schiene der CPU verursacht (dies ist unter Windows)?
- Was können wir tun, um die ursprüngliche Leistung aufrechtzuerhalten?
LOAD DATA INFILE
). Möglicherweise wird die Verlangsamung durch die Indexpopulation / -organisation nach jeder Einfügung verursacht. Überprüfen Sie, ob Sie mit Ihren Daten einige (oder alle) Indizes und INSERT
alles deaktivieren und dann die Indizes reaktivieren können. Ich denke nicht, dass es wirklich helfen könnte, aber das Sperren des Tisches könnte eine andere Option sein.
VACUUM FULL
Dies kann sich auf eine bestimmte Tabelle oder einfach VACUUM
auf die gesamte Datenbank oder VACUUM FULL
auf die gesamte Datenbank beziehen . Auf jeden Fall ist die Tatsache, dass es bei der Leistung hilft, verdächtig. VACUUM stellt tote Zeilen zurück, die sich aus UPDATEs und DELETEs ergeben. In einem Nur-INSERT-Szenario wird dies nicht benötigt.