sor*_*rke 5 sql-server concurrency optimization locking transactions
我们有一个系统同时插入来自多个站的大量数据,同时还暴露了数据查询接口.架构看起来像这样(抱歉格式不佳):
[SyncTable]
SyncID
StationID
MeasuringTime
[DataTypeTable]
TypeID
TypeName
[DataTable]
SyncID
TypeID
DataColumns...
Run Code Online (Sandbox Code Playgroud)
数据插入是在"同步"中完成的,并且像这样(我们只将数据插入系统,我们从不更新)
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 ...
Run Code Online (Sandbox Code Playgroud)
查询就像这样(对于给定的站点,测量时间和数据类型)
SELECT SyncID FROM SyncTable WHERE StationID = @StationID
AND MeasuringTime = @MeasuringTime
SELECT DataColumns FROM DataTable WHERE SyncID = @SyncIDJustSelected
AND DataTypeID = @TypeID
Run Code Online (Sandbox Code Playgroud)
我的问题是如何将插入的事务级别和查询的NOLOCK/READPAST提示结合起来,以便:
这可能是非常矛盾的目标,可能需要高事务隔离级别,但我对所有技巧和优化感兴趣,以实现对插入和选择的高响应性.我很乐意详细说明是否需要更多细节来清除更多调整和技巧.
更新:只需为将来的回复添加更多信息.我们最初在具有5+ TB存储空间的SAN网络上运行SQL Server 2005(可能在六个月内发布).我不确定SAn设置的是什么类型的RAID,以及我们可用的确切磁盘数量.
您将使用什么类型的磁盘系统?如果您有大型条带 RAID 阵列,写入应该表现良好。如果您可以估计每秒所需的读取和写入次数,则可以将这些数字代入公式并查看您的磁盘子系统是否能够跟上。也许你无法控制硬件......
您是否会将插入包装在事务中,这将使它们在插入完成之前无法读取?
如果您的硬件配置正确并且您正在注意 SQL 编码(看起来您确实如此),那么应该遵循以下步骤。
查看 SQLIO.exe 和 SQL Stress 工具:
\n\nSQLIOStress.exe\nSQLIOStress.exe 模拟 SQL Server 2000 I/O 行为的各种模式以确保基本的 I/O 安全。
\n\nSQLIOStress 实用程序可以从 Microsoft 网站下载。请参阅以下文章。
\n\n\xe2\x80\xa2 如何使用 SQLIOStress 实用程序对 SQL Server 等磁盘子系统施加压力\n http://support.microsoft.com/default.aspx?scid=kb;en-us;231619
\n\n重要 下载包含完整的白皮书,其中包含有关该实用程序的更多详细信息。
\n\nSQLIO.exe\nSQLIO.exe 是一个 SQL Server 2000 I/O 实用程序,用于建立基本基准测试结果。
\n\nSQLIO 实用程序可以从 Microsoft 网站下载。请参阅以下内容:\n\xe2\x80\xa2 SQLIO 性能测试工具(SQL 开发)\xe2\x80\x93 可用客户\n http://download.microsoft.com/download/f/3/f/f3f92f8b- b24e-4c2e-9e86-d66df1f6f83b/SQLIO.msi
\n