我们有一个系统同时插入来自多个站的大量数据,同时还暴露了数据查询接口.架构看起来像这样(抱歉格式不佳):
[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(可能在六个月内发布).我不确定SAn设置的是什么类型的RAID,以及我们可用的确切磁盘数量.