在事务复制中发布存储过程执行

SQL*_*ner 1 sql-server-2008 sql-server sql-server-2008-r2

在 SQL 2008 R2 中,我将更新一个将影响 2500 万行的表,该表当前正在复制(事务复制)。为了最大限度地减少对复制的影响,我可以创建一个存储过程,将更新语句包装在存储过程中并为复制添加这个存储过程吗?

通过在执行存储过程时执行此操作,它将复制存储过程的执行。我的问题是 SQL Server 如何知道只复制存储的 proc 执行(即实际的 exec myupateproc t-sql 命令)而不是在发布者上更新的底层表数据(即实际复制 2500 万条更新语句)?

Kin*_*hah 6

SQL Server 如何知道只复制存储的 proc 执行(即实际的 exec myupateproc t-sql 命令)而不是在发布者上更新的底层表数据(即实际复制 2500 万条更新语句)?

SQL Server 知道,当您设置文章属性时,如下所示:

在此处输入图片说明

在设置文章属性时,您可以显式设置仅复制 SP 定义、SP 的执行或 SP 的序列化事务中的执行。

请参阅此处。当您选择“SP的序列化事务”时,通过减少事务复制开销,将整个执行复制为单个事务,随着存储过程执行的复制,复制仅发送在订阅服务器上执行存储过程的命令,而不是将所有更新写入分发数据库,​​然后通过网络将它们发送到订阅者

事先对其进行测试,因为执行如此大的更新(2500 万行)对于复制来说太多了,无法处理(取决于您的复制拓扑 - 与发布者相同的分发服务器,地理上分开的发布者和订阅者等)以及描述的一些注意事项在BOL 中

你可能可以采用另一种方法,例如——

  1. 从复制中删除当前表。
  2. 你是否更新数据和(为了加快速度,如果表很大,你可以截断订阅者上的表 - 所以当你做快照时,复制不必对订阅者表执行删除)
  3. 使用nosync 选项将表添加回复制
  4. 对发布进行快照,但这次只会生成添加的表的快照。