Performance: Art der Datenspeicherung

Hallo pg-forum,
ich hab da mal 'ne Frage bezüglich der Performance von PostGreSQL.

Folgendes Szenario:
Ich habe hier 50 Verkehrsanlagen,
mit jeweils 12 Anlagenelementen,
jedes Anlagenlement speichert ca. alle 30sek einen Log-Eintrag.

Nun meine Frage:
Ist es performanter, wenn
a) alle Elemente ihre Daten in die selbe Tabelle speichern?
-> Wenige Tabellen mit viel Inhalt. Oder
b) jedes Element eine eigene Tabelle bekommt?
-> viele Tabellen mit wenig Inhalt. Oder
c) es ist PostGreSQL völlig Wurscht.

Bei a) ist es natürlich nicht eine Tabelle, sondern 'ne Tabellengruppe (nach Normalisierung).

Hoffe, ihr könnt mein Problem verstehen :wink:

Die Frage ist nicht, wie du die Daten speicherst, sondern wie und wie oft du diese abrufen musst. Solange du Daten nur speichern musst , um sie “ab und zu” mal, z.B. für Statistikzwecke abzurufen, ist das weniger wild.
Wenn du die Daten jedoch für Live-Sachen zur Verfügung stellen musst, musst du dein Konzept von vorneherein anders aufziehen.

Gut, rechnen wir, 50 * 12 * (2 * 60 * 24) = 1728000 Datensätze am Tag. Insgesamt.
Wie lange musst du diese Datensätze aufheben und wie oft musst du in diesen Datensätzen suchen?

Also die Daten müssen ca. zwei Jahre zur Verfügung stehen, allerdings wird nicht ständig auf die Daten zugegriffen (keine echten Live-Sachen), nur bei Report-Erstellung usw.
Die Statistik-Auswertung soll auch alle 5 min aktualisiert werden,
dh. die Anzeige der letzten eingetragenen Daten.

Primär wird auf Daten zugegriffen, die nicht älter als 3 Monate sind. Könnte man also einen zweiten Datenbankserver bereitstellen, auf den Daten, die älter als 3 Monate sind, archiviert werden? (Um den primären Datenbankserver zu entlasten?) Würde der Aufwand was bringen?

Achja, (schwerer!) Fehler von mir, nicht alle 30sek, sondern alle 5 min speichert ein Element seine Statistik-Daten -> verringert die Anzahl der täglichen Einträge auf 172800…
Macht nach 3 Monaten schon 16.070.400 Einträge…

16 Millionen Einträge ist nicht wirklich wild, wenn du nicht live darauf zugreifen musst sondern wenn es “egal” (im Sinne von Sekunden oder Minuten) ist, wie lange ein Report dauert.

Du könntest z.B. für jeden Monat eine Tabelle anlegen, falls du die Daten passend speichern kannst. Oder halt die Daten am Ende des Monats einmalig in eine Tabelle mit dem Monatsnamen kopieren, SELECT INTO sollte dabei helfen.

Die Frage, ob du einen zweiten Datenbankserver brauchst, kannst nur du selber beantworten: schafft dein vorhandener Server die Last oder geht er damit in die Knie?

Sicherlich lässt sich an der ein oder anderen Stelle noch Feintuning betreiben und ein gut gesetzter Index wird die Zeit für das Reporting sicherlich drastisch verkürzen. Aber primär kommt es hier auf eine gute Menge RAM und ausreichend Plattenplatz an. Nach dem Löschen größerer Datenmengen auch mal ein VACUUM fahren.

Alles solche Kleinigkeiten halt.