私は、巨大なセンサーアレイからのデータサンプルを保存するソリューション(appおよびdb)を実装することを任されました。アレイは現在約20,000個のセンサーで構成されていますが、まもなく100,000個のセンサーに拡大します。各センサーは10秒ごとにデータサンプルを送信し、各サンプルのサイズは28バイトです。
したがって、合計を行うと、次のようになります。
- 1日あたりセンサーあたり8640サンプル
- 1日あたりセンサーあたり242kBのデータ
- 1日あたり864百万サンプル
今、データを保存/取得する最善の方法は何だろうと思っていますか?ソフトウェアが既に指定された後、私はこのプロジェクトに「参加」したので、SQL Serverを使用してWindowsプラットフォームに実装する必要があります。
私の頭の中の現在の解決策は、データサンプルを格納する2つのテーブルを持つDBを作成することです。1つ目は2つ目のインデックスの一種として機能し、センサーごとに1日あたりのバイナリフィールドに照合サンプルを格納します。
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
基本的に、すべてのセンサーのサンプルを一時ファイル(センサーごとに1つ)に書き込みます。毎日の終わりに、表1のエントリを作成し、生成されたRecordIDを使用して、ファイルを表2のデータフィールドにダンプします。
この方法では、8億4400万エントリではなく、1日あたり100,000エントリしかテーブルに登録されません。データはLANまたは高速WANで利用可能である必要があります。そのため、1日単位でセンサーデータを取得できます。
すべてのデータを保存する必要がありますが、ほとんどのデータはおそらく読み込まれません。そのため、テーブルの読み取りの量は書き込みよりも大きくなることはありません。
データファイルへのパスを保存するだけで、ファイルシステムを使用して何かを実装できることは知っていますが、バイナリフィールドが256kB未満の場合、SQL ServerはNTFSよりも優れていることを読みました。(256 KBと1 MBの間には灰色の領域がありますが、1 MBを超えるバイナリサイズの場合、NTFSはSQL Serverよりもはるかに優れています)。
また、100,000個のセンサーからのデータを独自のファイルに保存する場合、フォルダー内に大量のファイルがあるか、各フォルダーにいくつかのファイルがある複雑なツリー構造を持つことにより、ファイルシステムに問題を引き起こすことはありません。ファイルの断片化も考慮します。
誰でも上記に関する実用的なアドバイス/コメントを提供できますか?
私が陥りそうな明らかな落とし穴はありますか?
サンプルデータは非常にうまく圧縮されています。242 kBファイルは約85kBに圧縮されます。ただし、サンプルデータ(列)が自動的に圧縮されるように、データベースレベルで何らかの圧縮を実装できますか?
このプロジェクトでは、SQL Serverは明らかに間違った選択肢ですか?
2つのテーブルの設計は賢明ですか、それとも2つのテーブルと同じように「パフォーマンス」の高い単一のテーブルに組み合わせることができますか?