我們有一個系統同時插入來自多個工作站的大量數據,同時還暴露了一個數據查詢接口。該模式看起來是這樣的(約窮人格式不好意思):事務級別,nolock/readpast和併發
[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 ...
和查詢是這樣的(對於一個給定站,measuringtime和數據類型)
SELECT SyncID FROM SyncTable WHERE StationID = @StationID
AND MeasuringTime = @MeasuringTime
SELECT DataColumns FROM DataTable WHERE SyncID = @SyncIDJustSelected
AND DataTypeID = @TypeID
我的問題是我們如何能夠在刀片和NOLOCK/READP結合事務級在查詢AST提示,以便:
- 我們最大限度的併發在我們的系統,同時有利於插入(我們需要存儲大量的數據,一些高達2000+記錄第二)
- 只查詢返回來自「提交」同步的數據(我們不希望結果集有一半插入同步或由於跳過鎖定而與一些跳過的條目同步)
- 我們不在乎是否包含「最新」數據在查詢中,我們更關心一致性和響應性,然後針對「實時」和最新數據
這可能是非常矛盾的目標,可能需要很高的事務隔離級別,但我對所有技巧和優化感興趣,以實現對插入和選擇的高響應性。我很樂意詳細說明是否需要更多細節來清除更多的調整和技巧。
更新:爲未來的回覆添加更多信息。我們正在運行SQL Server 2005(可能在六個月內於2008年)在最初具有5+ TB存儲的SAN網絡上運行。我不確定SAn設置了什麼樣的RAID,以及我們有多少可用的磁盤。
將此標記爲答案,因爲「解決方案」的一部分與正確設置特定磁盤系統有關,這極大地提高了吞吐量 – 2009-10-14 09:03:10