我正在为以下场景设计 SQL Server 2012 数据库的解决方案
- 该数据库包含大约 1M 条记录,其中包含 4 或 5 个表之间的一些简单的父子关系
- 数据库上有 24x7 的高负载读取
- 每天一次,我们会收到一个包含大约 1000 个插入、更新和删除的批次,这些应该合并到数据库中,有时这个数字可能会更高。
- 除了每日批次外,数据库没有其他写入者
有一些“特殊”要求
- 由于这些更新,读者不应遇到任何明显的延迟
- 从读者的角度来看,应该以原子方式处理整个批次。读者不应看到部分处理的批次
- 如果更新中途失败,我们需要回滚批次的所有更改
- 批处理本身不是时间关键的,通过简单的实现,现在最多需要几分钟,这很好。
我正在考虑的选项是
围绕整个更新批次包装单个数据库事务(这可能是一个大事务),并使用快照隔离让读者在更新运行时读取原始数据。
使用分区切换,这个功能似乎是为这种用例而设计的。不利的一面似乎是,在我们开始处理批处理之前,我们需要创建所有原始数据的副本。
切换整个数据库。我们可以创建整个数据库的副本,在这个副本中处理批处理,然后将所有客户端重定向到这个数据库(例如,通过更改它们的连接字符串)。这甚至应该允许我们将数据库设为只读,甚至可能创建数据库的多个副本以实现可伸缩性。
这些选项中的哪一个或另一个最适合这种情况,为什么?