2010-07-20 20 views
6

Ich habe ein System, das jede Sekunde einige gemessene Werte aufzeichnet. Was ist der beste Weg, um Trenddaten zu speichern, die einer bestimmten Sekunde entsprechen?Trend 100 Millionen + Zeilen

1 day = 86.400 seconds 
1 month = 2.592.000 seconds 

Etwa 1000 Werte, um jede Sekunde im Auge zu behalten.

Momentan gibt es 50 Tabellen, die die Trenddaten für jeweils 20 Spalten gruppieren. Diese Tabellen enthalten mehr als 100 Millionen Zeilen.

TREND_TIME datetime (clustered_index) 
    TREND_DATA1 real 
    TREND_DATA2 real 
    ... 
    TREND_DATA20 real 
+1

Werden Trenddaten oft gelesen oder aktualisiert? –

+0

Sie sollten das RDBMS angeben - dies ist eine Frage der physischen Datenbankimplementierung, nicht des logischen Entwurfs, RDBMS spielt hier keine Rolle. – Unreason

+0

Es wird viel für die Anzeige vieler Arten von Grafiken gelesen. – kerem

Antwort

2

Ich würde die Daten sparen Ansatz ändern und anstatt "rohe" Daten als Werte zu speichern Ich würde 5-20 Minuten Daten in einem Array (Speicher, BL Seite) speichern, komprimieren dieses Array mit LZ-basierten Algorithmus und dann speichern die Daten in der Datenbank als Binärdaten. Es wäre auch schön, Max/Min/Avg/etc .. Informationen für diesen Binary Chunk zu speichern.

Wenn Sie die Daten verarbeiten möchten, können Sie den Datenblock nach dem Chunk verarbeiten, und dadurch behalten Sie ein geringes Speicherprofil für Ihre Anwendung bei. Dieser Ansatz ist etwas komplexer, aber in Bezug auf Speicher/Verarbeitung sehr skalierbar.

hoffe das hilft.

+0

Dieser Ansatz ist nicht skalierbar. Ich denke, wenn ich einen Monat Daten sehen möchte, muss ich viel dekomprimieren. – kerem

+0

Ich weiß was du meinst. Um dieses Problem zu lösen, erstellen Sie, wenn möglich, eine Zusammenfassung der komprimierten Daten, die Sie über einen Monat/Jahr hinweg gespeichert haben, und speichern Sie diese Zusammenfassung in der Datenbank. Sie müssten wahrscheinlich verschiedene Zusammenfassungen speichern, die verschiedene Operationen auf den Basisdaten repräsentieren, aber Sie werden blendende Geschwindigkeit bekommen. – Gilad

0

Ist das Problem das Datenbankschema?

1 Sekunde zu vielen Trends zeigt Ihnen offensichtlich zuerst eine separate Tabelle mit einem Fremdschlüssel der Sekunden-Tabelle. Wenn die "vielen Trendwerte" durch die Spalten und nicht durch Zeilen dargestellt werden, können Sie alternativ die Spalten immer an die Tabelle seconds anhängen und Nullwerte annehmen.

Haben Sie das versucht? War die Leistung schlecht?

3

Haben Sie in Betracht gezogen RRDTool - es bietet eine Round-Robin-Datenbank oder Ringspeicher für Zeitreihendaten. Sie können Daten in jedem gewünschten Intervall speichern und dann Konsolidierungspunkte und eine Konsolidierungsfunktion definieren (Summe, Min, Max, Durchschnitt) für eine bestimmte Periode, 1 Sekunde, 5 Sekunden, 2 Tage usw. Weil sie weiß was Konsolidierungspunkte, die Sie möchten, müssen nicht alle Datenpunkte gespeichert werden, nachdem sie aggregiert wurden.

Ganglia und Cacti verwenden Sie dies unter den Abdeckungen und es ist sehr einfach aus vielen Sprachen zu verwenden.

Wenn Sie alle Datenpunkte benötigen, sollten Sie sie nur für die Aggregation verwenden.

+0

Ich bin definitiv für diesen Ansatz, ich benutze Ganglia für die Verfolgung vieler Datenreihen über Jahre und es funktioniert super! –

+0

Danke, Ganglien und Kakteen scheinen sehr nützlich zu sein. Ich konnte jedoch keine C# -Bibliothek für RRDTool finden. – kerem

Verwandte Themen