Speichern und Abfragen von rollierenden Daten in PostgreSQL


11

Ich habe eine große Menge von Wettermodelldaten, die in eine PostgreSQL-Datenbank gestellt werden. Die Maschine verfügt über 8 Kerne und 16 GB RAM. Ich verwende PostgreSQL 9.3 mit PostGIS 2.1. Jede Tabelle enthält unterschiedliche Wetterdaten (Temperatur, Taupunkt, Wind usw.). Jede Tabelle enthält 6-7 Spalten: Breite, Länge, Punktgeometrie, Höhe, Datum und Uhrzeit, für die das Modell relevant ist, und 1-2 Datenwerte von Interesse. Die Daten werden hauptsächlich nach Zeit und Höhe nach einem Begrenzungsrahmen abgefragt. Es werden ungefähr 145.757.360 Zeilen pro Tabelle vorhanden sein (Daten, die älter als jetzt sind und nicht mehr relevant sind, werden gelöscht). Ich schätze die Größe der Tabellen ungefähr auf jeweils etwa 10 GB ohne Indizes. (Das sind 52 Byte Daten plus 23 Byte Overhead pro Zeile). Die Daten werden regelmäßig aktualisiert / eingefügt, sobald neue Modelldaten verfügbar werden. Hinweis:

Also schaue ich mir diese beiden Pläne an:

  1. Indizieren und gruppieren Sie einfach nach (Datum / Uhrzeit, Höhe) mit einem zusätzlichen Index für die Punktgeometrie. Führen Sie einen regulären Cron-Job aus, der alte Zeilen löscht, Vakuum / Analyse ausführt und Cluster neu gruppiert.
  2. Partition nach Datum / Uhrzeit und dann Cluster und Index nach Höhe pro Tabelle mit einem Index für die Geometrie. Führen Sie einen regulären Cron-Job aus, um künftig neue Tabellen hinzuzufügen und alte Tabellen zu löschen.

Des Weiteren,

  • Ich weiß also, dass das Ablegen eines Tisches viel effizienter ist und das Löschen und Staubsaugen viel effizienter ist. Aber würde ich sonst einen Leistungsschub sehen?
  • Sind Partitionen geeignet, wenn alle Tabellen gleichmäßig aktualisiert und ausgewählt werden, bis sie als irrelevant gelöscht werden (aus der Dokumentation geht hervor, dass Partitionen am besten funktionieren, wenn nur einige von ihnen ausgewählt werden)?

Sind die Auswahlen bei der Übermittlung von Daten schneller als der Clustered-Index? Ändert sich die Antwort, wenn mehrere Anfragen gleichzeitig gestellt werden?

Vielen Dank. Ich hoffe, ich habe alle benötigten Daten zusammengestellt. Wenn nicht, lass es mich wissen und ich werde es hinzufügen.


1
Autsch, in diesen schmalen Zeilen schmerzen die großen Zeilenüberschriften von PostgreSQL wirklich. Schade, dass nicht wirklich viel entfernt werden kann; Es ist nicht so, dass wir verlieren können xminoder xmaxusw. Es gibt eine Funktion, die es in 9.4 schaffen könnte, die Sie wahrscheinlich begeistern wird, Minmax-Indizes genannt, die solche Dinge viel bequemer macht.
Craig Ringer

1
Wiederholt sich die folgende Kombination: "Breite, Länge, Punktgeometrie, Höhe". Wenn ja, kann das Normalisieren in eine andere Tabelle etwas Platz sparen.
AK

Nur am Rande. Eine PostGIS-Geometrie ist ein binäres Array und nicht für Menschen lesbar. Ich könnte diese Werte bei der Ausgabe ableiten, aber dann könnte ich sie nicht gruppieren. Ich könnte einen GeoHash zum Clustering verwenden, aber das ist nicht mehr lesbar als der Lat Lon. Aber so oder so ist Platz nicht das Problem. Sie boten so viele Terrabyte an, wie ich füllen kann. Das Problem ist, dass ich Terrabyte nicht schnell abfragen kann. Die Datenbank selbst ist weitgehend nicht transaktionsbezogen. Nur zwei Skripte haben überhaupt Schreibzugriff. Alles andere ist streng schreibgeschützt.
Bshender

Craig: Sie scheinen faszinierend zu sein. Ich freue mich darauf, mit ihnen zu experimentieren, wenn sie herauskommen. Irgendwelche Gedanken zu meinem Setup in 9.3?
Bshender

1
Könnten Sie bitte zwei Informationen angeben: 1) Was ist für Sie am wichtigsten, Geschwindigkeit einfügen oder Abfragegeschwindigkeit? 2) Welche Anfragen sind am häufigsten?
Thomas Kejser

Antworten:


1

Alles in allem würde ich Option 2 wählen. Die Daten werden gleichmäßig ausgewählt, aber ich gehe davon aus, dass für eine bestimmte Abfrage nur ein oder zwei Datumspartitionen beteiligt sind. Es ist eine Schande, dass Sie nicht nach Geolokalisierung und Partition am Datum gruppieren können, was ideal wäre. Die Höhe korreliert ohnehin eher mit der Geolokalisierung, wenn die Begrenzungsrahmen ausreichend klein sind.

Angesichts der verfügbaren Auswahl ist es eine gute Sache, sauberere Datenvorgänge durchzuführen und ein tägliches Vakuum zu vermeiden.

Mit Option 1 kann die Lieferung schneller erfolgen, obwohl ich vermute, dass es sich wahrscheinlich um eine Wäsche handelt. Mit Option 1 werden Datensätze mit demselben Datum und derselben Höhe in einem großen Clustered-Index nebeneinander platziert. Mit Option 2 werden Datensätze mit demselben Datum und derselben Höhe in vielen kleineren Clustered-Indizes nahe beieinander platziert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.