2009-05-19 9 views
0

Was ist der "beste" (korrekte, Standard usw.) Weg, um ein Protokoll der mit einer festgelegten Rate erfassten Daten zu führen (jede Minute, alle 5 Sekunden, alle 10 ms, usw.) in einer Oracle-Datenbank?Datenprotokollierung mit Oracle (oder einem beliebigen RDBMS)

Es scheint ineffizient zu sein, den 7-Byte-DATE-Wert für jeden Datenpunkt zu speichern (besonders, wenn die Frequenz zunimmt). Durch das Packen der Daten in eine Art Rohformat werden jedoch Statistiken und andere Berechnungen für die Daten erschwert.

Ich denke, diese Frage ist allgemein genug für alle RDBMS, aber in diesem Fall verwende ich Oracle.

Antwort

2

Wie viel kostet es für ein Terabyte Festplatte, und verdichtet diese 7 Bytes wirklich die Mühe wert? Wenn Sie Statistiken und Berichte zu den Protokollen basierend auf der Zeit berechnen möchten, wird es sehr schmerzhaft sein, das Datum für die Verwendung in SQL-Abfragen zu dekomprimieren.

Mit Oracle einfach die Daten in eine Tabelle protokollieren - versuchen Sie nicht, zu viel zu protokollieren oder zu viele Indizes in der Protokolltabelle zu haben. Stellen Sie sicher, dass Ihre Protokolltabelle von Tag 1 bis zu den managbaren Größen partitioniert ist. Dies kann eine Partition pro Tag, Woche oder Monat sein, abhängig davon, wie viele Daten Sie generieren. Entwerfen Sie Ihre Hausordnung auch vom ersten Tag an.

Wenn Sie am Ende Ihrer 'Periode' eine neue Partition hinzufügen, wenn die Daten in die neue Partition gehen, können Sie 'alter partition move compress' verwenden, um die Daten zu komprimieren, um sie online auf weniger Speicherplatz zu speichern .

Es gibt viele Optionen, Sie müssen nur die Anforderungen durchdenken, die Sie versuchen müssen, um die beste Lösung zu finden. Je nachdem, was Sie tun, kann auch die Protokollierung in eine Datei eine Option sein - aber hüten Sie sich vor Tausenden und Abertausenden von Dateien in einem einzigen Verzeichnis, was ebenfalls Probleme verursachen kann.

0

Da jede Datenzeile einzeln stehen muss, müssen Sie den Speicherplatz verwenden, um den vollständigen DATE-Wert aufzuzeichnen - es sei denn, Sie verwenden einen Unix-Zeitstempel (ganzzahlige Sekunden seit 1970-01-01 00) : 00: 00Z, oder eine andere geeignete Epoche oder Referenzpunkt). Das passt in 4 Bytes, um eine 68-jährige Periode auf jeder Seite der Epoche zu geben (angenommen 32-Bit-Ganzzahlen mit Vorzeichen). Es ist vielleicht nicht ganz so bequem, aber es ist relativ kompakt.

+0

Warum stören? Es ist eine winzige Menge an Platzeinsparungen. "nicht ganz so bequem" scheint mir eine Untertreibung. Die Verwendung einer der SQL-Datumsfunktionen erfordert jetzt manuelle Konvertierungen und erfordert spezielle Indexierungsstrategien. – RussellH

+0

Ich würde mich auch nicht darum kümmern, aber ich bin nicht die Person, die die Frage stellt, die um den Raum besorgt zu sein scheint. Das Speichern einer kürzeren Menge spart Speicherplatz. Selbst bei Terabytes von Datenträgern können 3 Byte Overhead auf eine ausreichend kleine Zeilengröße addiert werden. Wenn die aufgezeichneten Informationen groß genug sind, dass die 3-Byte-Speicherung vernachlässigbar ist, dann verwenden Sie den vollständigen DATE-Typ. –

+0

Die Abfrage muss mit geeigneten Funktionen nicht unerträglich schwierig sein. Es hängt davon ab, was Oracle ohnehin bietet, und ich bin nicht ausreichend mit den Details der Oracle-Datums-/Uhrzeitfunktionen vertraut, um eine detaillierte Antwort zu geben. –

Verwandte Themen