2

我正在为以下场景设计 SQL Server 2012 数据库的解决方案

  • 该数据库包含大约 1M 条记录,其中包含 4 或 5 个表之间的一些简单的父子关系
  • 数据库上有 24x7 的高负载读取
  • 每天一次,我们会收到一个包含大约 1000 个插入、更新和删除的批次,这些应该合并到数据库中,有时这个数字可能会更高。
  • 除了每日批次外,数据库没有其他写入者

有一些“特殊”要求

  1. 由于这些更新,读者不应遇到任何明显的延迟
  2. 从读者的角度来看,应该以原子方式处理整个批次。读者不应看到部分处理的批次
  3. 如果更新中途失败,我们需要回滚批次的所有更改
  4. 批处理本身不是时间关键的,通过简单的实现,现在最多需要几分钟,这很好。

我正在考虑的选项是

  • 围绕整个更新批次包装单个数据库事务(这可能是一个大事务),并使用快照隔离让读者在更新运行时读取原始数据。

  • 使用分区切换,这个功能似乎是为这种用例而设计的。不利的一面似乎是,在我们开始处理批处理之前,我们需要创建所有原始数据的副本。

  • 切换整个数据库。我们可以创建整个数据库的副本,在这个副本中处理批处理,然后将所有客户端重定向到这个数据库(例如,通过更改它们的连接字符串)。这甚至应该允许我们将数据库设为只读,甚至可能创建数据库的多个副本以实现可伸缩性。

这些选项中的哪一个或另一个最适合这种情况,为什么?

4

1 回答 1

1
  1. 事务策略将阻塞并导致延迟。

分区切换并不能真正解决您的解决方案,因为您应该考虑与今天对数据库执行此操作相同...(因此回滚/插入)仍然会阻塞,但是它可以被隔离为仅部分您的数据并非全部...

您最好的选择是使用 2 个数据库并切换连接字符串...

或使用 1 个数据库并拥有 2 组表,并使用交换后查看“活动”表的视图或存储过程。您仍然可能遇到磁盘争用问题,但从锁定的角度来看,您会没事的。

于 2014-07-02T15:11:48.167 回答