Ich wurde beauftragt, eine Lösung (App und DB) zu implementieren, um die Datenproben von einem riesigen Sensorarray zu speichern. Das Array besteht derzeit aus ungefähr 20.000 Sensoren, aber das wird bald auf 100.000 Sensoren anwachsen. Jeder Sensor sendet alle 10 Sekunden ein Datenmuster und jedes Muster ist 28 Byte groß.
Das Betragen führt also zu:
- 8640 Proben pro Sensor und Tag
- 242 KB Daten pro Sensor und Tag
- 864 Millionen Proben pro Tag
Jetzt habe ich mich gefragt, wie ich die Daten am besten speichern / abrufen kann. Ich bin diesem Projekt "beigetreten", nachdem die Software bereits angegeben wurde, sodass sie unter Verwendung von SQL Server auf einer Windows-Plattform implementiert werden muss.
Die aktuelle Lösung in meinem Kopf besteht darin, eine Datenbank mit zwei Tabellen zum Speichern der Datenbeispiele zu erstellen. Das erste dient als eine Art Index für das zweite, in dem die gesammelten Stichproben pro Tag und Sensor in einem Binärfeld gespeichert werden:
Table 1:
RecordID - BigInt - Identity
SensorID - BigInt - Primary Key
Date - DateTime - Primary Key (yyyy-mm-dd)
Table 2:
RecordID - BigInt - Primary Key (from an insert into Table 1)
Data - Binary
Grundsätzlich schreibe ich die Samples aller Sensoren in temporäre Dateien (1 pro Sensor). Am Ende eines jeden Tages werde ich dann einen Eintrag in Tabelle 1 erstellen, die generierte RecordID verwenden und die Datei in das Datenfeld in Tabelle 2 sichern.
Auf diese Weise habe ich nur 100.000 Einträge pro Tag in der Tabelle, anstatt 864 Millionen Einträge. Die Daten sollten im LAN oder im Hochgeschwindigkeits-WAN verfügbar sein, sodass das Abrufen der Sensordaten auf Tagesbasis akzeptabel wäre.
Obwohl alle Daten gespeichert werden müssen, werden die meisten wahrscheinlich nie gelesen. Die Anzahl der Lesevorgänge in der Tabelle (n) wird also nicht größer sein als die Anzahl der Schreibvorgänge.
Ich weiß, dass ich etwas mithilfe des Dateisystems implementieren könnte, indem ich nur den Pfad zu den Datendateien speichere, aber ich habe gelesen, dass SQL Server NTFS übertrifft, während Ihre Binärfelder dank 256 KB weniger sind. (Ein grauer Bereich liegt zwischen 256 KB und 1 MB, während NTFS SQL Server für Binärgrößen> 1 MB bei weitem übertrifft.)
Ich bin auch etwas vorsichtig, wenn ich Daten von 100.000 Sensoren ohne Probleme im Dateisystem in eigenen Dateien speichern möchte, indem ich entweder große Mengen von Dateien in einem Ordner oder eine komplexe Baumstruktur mit wenigen Dateien in jedem Ordner habe, ohne dies zu tun sogar unter Berücksichtigung der Dateifragmentierung.
Kann mir jemand praktische Ratschläge / Kommentare zu den oben genannten Themen geben?
Gibt es offensichtliche Fallstricke, in die ich fallen werde?
Die Beispieldaten werden recht gut komprimiert. Eine 242-kB-Datei wird auf ca. 85 kB komprimiert. Kann ich jedoch eine Art von Komprimierung auf Datenbankebene implementieren, sodass die Beispieldaten (Spalte) automatisch komprimiert werden?
Ist SQL Server eine offensichtlich falsche Wahl für dieses Projekt?
Ist mein Design der beiden Tische sinnvoll, oder könnte ich es genauso gut zu einem einzigen Tisch kombinieren, der immer noch so "performant" ist wie die beiden Tische?