我们有一个系统,从多个站点同时插入大量数据,同时还暴露了一个数据查询接口。架构看起来像这样(抱歉格式不好):
[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 提示,以便:
- 我们在支持插入的同时最大化系统中的并发性(我们需要存储大量数据,每秒高达 2000 多条记录)
- 查询仅从“已提交”同步返回数据(我们不希望结果集包含半插入同步或由于锁跳过而包含一些跳过条目的同步)
- 我们不关心查询中是否包含“最新”数据,我们更关心一致性和响应能力,而不是“实时”和最新数据
这可能是非常矛盾的目标,并且可能需要高事务隔离级别,但我对所有技巧和优化感兴趣,以实现对插入和选择的高响应性。如果需要更多细节来消除更多调整和技巧,我将很乐意详细说明。
更新:只需为将来的回复添加更多信息。我们在最初具有 5+ TB 存储的 SAN 网络上运行 SQL Server 2005(可能在 6 个月内 2008)。我不确定 SAn 设置了哪种 RAID,以及我们有多少磁盘可用。