Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQLServer2008中,快速更新表中的大量行,而不阻止对引用表的插入_Sql Server_Sql Server 2008_Locking_Large Data - Fatal编程技术网

Sql server 在SQLServer2008中,快速更新表中的大量行,而不阻止对引用表的插入

Sql server 在SQLServer2008中,快速更新表中的大量行,而不阻止对引用表的插入,sql-server,sql-server-2008,locking,large-data,Sql Server,Sql Server 2008,Locking,Large Data,上下文: 我有一个系统,作为遗留会计系统的Web UI。这个遗留系统每天多次向我发送一个大文本文件,这样我就可以更新数据库中的合同表(该文件可以有新合同,或者只更新现有合同的值)。该表目前约有200万行和150列。我不能在这些更新期间停机,因为它们发生在白天,并且在任何给定的时间内通常有大约40个登录用户 我的系统的用户不能更新合同表,但他们可以在引用合同表的表中插入记录(合同表ID列的外键) 要更新我的合同表,我首先使用大容量插入将文本文件加载到一个临时表中,然后使用MERGE语句创建或更新1

上下文: 我有一个系统,作为遗留会计系统的Web UI。这个遗留系统每天多次向我发送一个大文本文件,这样我就可以更新数据库中的合同表(该文件可以有新合同,或者只更新现有合同的值)。该表目前约有200万行和150列。我不能在这些更新期间停机,因为它们发生在白天,并且在任何给定的时间内通常有大约40个登录用户

我的系统的用户不能更新合同表,但他们可以在引用合同表的表中插入记录(合同表ID列的外键)

要更新我的合同表,我首先使用大容量插入将文本文件加载到一个临时表中,然后使用MERGE语句创建或更新100k条记录。这里是我的问题-在MERGE语句期间,因为我使用的是readcommitted快照隔离,用户可以继续查看数据,但不能插入任何内容-事务将超时,因为契约表被锁定

问题:是否有人知道一种方法可以快速更新如此大量的行,同时强制执行数据完整性并且不阻止引用表上的插入

我已经考虑了一些解决办法,但我希望有更好的办法:

  • 放下外键我想加强我的数据一致性,所以这听起来不是一个好的解决方案
  • 减少MERGE语句上的批处理大小,使事务足够快,不会导致其他事务超时。-我已经试过了,但是同步过程变得太慢了;如前所述,我经常收到更新文件,更新后的数据很快就可用是至关重要的
  • 创建一个包含单个压缩列的中间表,并让其他表引用该表,而不是合同表。这将使我能够更快地更新它,同时保持良好的完整性。-我想这会管用,但听起来很复杂
  • 更新:
    结果我把外键掉了。由于该系统已投入生产一段时间,并且日志从未显示违反外键约束的情况,因此我非常确定不会创建不一致的数据。感谢所有发表评论的人。

    可能重复:如果您有enterprise edition,您可以研究“热插拔分区”…下面是一篇示例文章: