次のスキーマを持つテーブルがあります。
CREATE TABLE Measurement (
HubId bigint NOT NULL
,DeviceId bigint NOT NULL
,Timestamp datetime NOT NULL
,Value bigint NOT NULL
)
1秒間に約100,000レコードでこのテーブルにレコードをインポートし、複数の同時接続に分割します。テーブルをヒープ(つまり、インデックスなし)として扱い、を使用することで、このレベルのパフォーマンスを実現できますSqlBulkCopy
。毎秒、100,000のユニークなHubId
組み合わせDeviceId
とTimestamp
増分の組み合わせがあります。Value
時間の経過とともに累積されます。
また、最新の2つの値(この場合は最後と最後から2番目-挿入は常に順番になります)をGROUP BY HubId, DeviceId
1秒に1回読み取る必要がありますが、生成する行のサブセット(ユーザーが関心のある行)に対してのみです。最後の2つの値のリアルタイムの差。
さらに、履歴の目的で、15分ごとに1回データを15分のスライスに集約する必要があります。このデータは、前の15分のスライスの最大値と現在の15分のスライスの最大値に基づいて集計されます...これはデータセット全体で発生する必要がありますが、一意HubId
のDeviceId
組み合わせのために複数の接続に分割できます。累積的であるためValue
、これは事実上、前および現在の15分のスライスの最後の値です。
インデックスを使用してテーブルに一括挿入すると、排他テーブルロックにエスカレーションされます。さらに、排他的なテーブルロックにエスカレートせずにクエリを実行させることはできないようです。
誰かがこれを構築するための最良の方法について私にいくつかの指針を与えることができますか?最善の方法を模索している壁に頭をぶつけています...
ありがとう、ディーン