gpt4 book ai didi

sql-server - 事务级别、nolock/readpast 和并发性

转载 作者:行者123 更新时间:2023-12-02 22:30:34 36 4
gpt4 key购买 nike

我们有一个系统,可以同时插入来自多个站点的大量数据,同时还暴露一个数据查询接口(interface)。架构看起来像这样(很抱歉格式不佳):

[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 多条记录)
  2. 查询仅从“已提交”同步返回数据(我们不希望结果集具有半插入同步或由于锁跳过而导致一些跳过条目的同步)
  3. 我们不关心查询中是否包含“最新”数据,我们更关心一致性和响应能力,而不是“实时”和最新数据

这可能是非常冲突的目标,并且可能需要高事务隔离级别,但我对所有技巧和优化感兴趣,以实现插入和选择的高响应能力。如果需要更多细节来进行更多调整和技巧,我将很乐意详细说明。

更新:只是添加更多信息以供将来回复。我们最初在具有 5+ TB 存储空间的 SAN 网络上运行 SQL Server 2005(可能是六个月内的 2008 年)。我不确定 SAn 设置为哪种 RAID 以及我们有多少可用磁盘。

最佳答案

如果您运行的是 SQL 2005 及更高版本,请考虑实现 snapshot isolation 。使用 nolock 将无法获得一致的结果。

在 SQL 2000 上解决这个问题要困难得多。

关于sql-server - 事务级别、nolock/readpast 和并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/287179/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com