在 SQL 2008 R2 中,我将更新一个将影响 2500 万行的表,该表当前正在复制(事务复制)。为了尽量减少对复制的影响,我可以创建一个存储过程,将更新语句包装在存储过程中并添加这个存储过程进行复制吗?
通过在执行存储过程时执行此操作,它将复制存储过程的执行。我的问题是 SQL 服务器如何知道只复制存储的 proc 执行(即实际的 exec myupateproc t-sql 命令)而不是在发布者上更新的基础表数据(即实际复制 2500 万条更新语句)?
在 SQL 2008 R2 中,我将更新一个将影响 2500 万行的表,该表当前正在复制(事务复制)。为了尽量减少对复制的影响,我可以创建一个存储过程,将更新语句包装在存储过程中并添加这个存储过程进行复制吗?
通过在执行存储过程时执行此操作,它将复制存储过程的执行。我的问题是 SQL 服务器如何知道只复制存储的 proc 执行(即实际的 exec myupateproc t-sql 命令)而不是在发布者上更新的基础表数据(即实际复制 2500 万条更新语句)?
SQL 服务器如何知道只复制存储过程执行(即实际的 exec myupateproc t-sql 命令)而不是在发布者上更新的基础表数据(即实际复制 2500 万条更新语句)?
SQL Server 知道,当您设置文章属性时,如下所示:
您可以在设置 Article 属性时显式设置仅复制 SP 定义、SP 的执行或 SP 的序列化事务中的执行。
参考这里。当您选择“SP 的序列化事务”时,通过减少事务复制开销,整个执行被复制为单个事务,即通过存储过程执行的复制,复制仅发送在订阅服务器上执行存储过程的命令,而不是将所有更新写入分发数据库,然后通过网络将它们发送到订阅服务器
事先对其进行测试,因为执行如此大的更新(2500 万行)对于复制来说将是太多的处理(取决于您的复制拓扑 - 与发布者相同的分发服务器,地理上分开的发布者和订阅者等)以及所描述的一些警告在BOL中。
您可能可以采用另一种方法,例如-