複数のステーションから大量のデータを同時に挿入すると同時に、データクエリインターフェイスを公開するシステムがあります。スキーマは次のようになります(フォーマットが不適切なため申し訳ありません)。
[SyncTable]
SyncID
StationID
MeasuringTime
[DataTypeTable]
TypeID
TypeName
[DataTable]
SyncID
TypeID
DataColumns...
データの挿入は「同期」で行われ、次のようになります(システムにデータを挿入するだけで、更新することはありません)
INSERT INTO SyncTable(StationID, MeasuringTime) VALUES (X,Y); SELECT @@IDENTITY
INSERT INTO DataTable(SyncID, TypeID, DataColumns) VALUES
(SyncIDJustInserted, InMemoryCachedTypeID, Data)
... lots (500) similar inserts into DataTable ...
そして、クエリは次のようになります(特定のステーション、測定時間、およびデータ型に対して)
SELECT SyncID FROM SyncTable WHERE StationID = @StationID
AND MeasuringTime = @MeasuringTime
SELECT DataColumns FROM DataTable WHERE SyncID = @SyncIDJustSelected
AND DataTypeID = @TypeID
私の質問は、挿入のトランザクションレベルとクエリのNOLOCK/READPASTヒントをどのように組み合わせて次のようにすることができるかです。
- 挿入を優先しながら、システムの同時実行性を最大化します(大量のデータを保存する必要があり、1秒あたり2000以上のレコードが必要です)
- クエリは、「コミットされた」同期からのデータのみを返します(半分挿入された同期、またはロックスキップのためにスキップされたエントリとの同期を含む結果セットは必要ありません)
- 「最新の」データがクエリに含まれているかどうかは関係ありません。「ライブ」で最新のデータよりも一貫性と応答性を重視します。
これは非常に相反する目標であり、高いトランザクション分離レベルが必要になる場合がありますが、挿入と選択の両方で高い応答性を実現するためのすべてのトリックと最適化に関心があります。より多くの微調整やトリックを洗い流すためにさらに詳細が必要な場合は、喜んで詳しく説明します。
更新:将来の返信のためにもう少し情報を追加するだけです。最初は5TB以上のストレージを備えたSANネットワークでSQLServer2005(おそらく6か月以内に2008年)を実行しています。SAnが設定されているRAIDの種類と、使用可能なディスクの正確な数がわかりません。