背景: 我有一个系统充当旧会计系统的 Web UI。这个遗留系统每天多次向我发送一个大文本文件,因此我可以更新数据库中的合同表(该文件可以包含新合同,或者只是更新现有合同的值)。该表目前有大约 2M 行和大约 150 列。在这些更新期间我不能有停机时间,因为它们发生在白天,并且在任何给定时间通常有大约 40 个登录用户。
我系统的用户不能更新 CONTRACT 表,但他们可以在引用 CONTRACT 表的表中插入记录(外键到 CONTRACT 表的 ID 列)。
为了更新我的 CONTRACT 表,我首先使用批量插入将文本文件加载到临时表中,然后我使用 MERGE 语句以 100k 记录的批次创建或更新行。这是我的问题 - 在 MERGE 语句期间,因为我使用 READ COMMITED SNAPSHOT 隔离,用户可以继续查看数据,但他们不能插入任何内容 - 事务将超时,因为 CONTRACT 表被锁定。
问题:有没有人知道一种快速更新大量行的方法,同时强制数据完整性并且不阻塞引用表的插入?
我已经考虑了一些解决方法,但我希望有更好的方法:
- 删除外键。- 我想强制我的数据一致性,所以这听起来不是一个好的解决方案。
- 减少 MERGE 语句上的批处理大小,以便事务足够快而不会导致其他事务超时。- 我试过了,但是同步过程太慢了;我上面是否提到过,我经常收到更新文件,并且更新后的数据在不久之后可用是至关重要的。
- 创建一个带有单个 CONTRACTID 列的中间表,并让其他表引用该表,而不是 CONTRACT 表。这将使我能够更快地更新它,同时保持良好的完整性。- 我想它会起作用,但听起来很复杂。
更新: 我最终放弃了我的外键。由于系统已经投入生产一段时间,而且日志从来没有显示违反外键约束,我很确定不会创建不一致的数据。感谢所有评论的人。