在SQL Server复制,当1大交易发布数据库中执行,如一次性操作十万或一百万以上的数据。当操作完成数据、日志读取器代理程序将扫描事务日志并将其传递到分发数据库在同一时间。如果最后的交易是不完成,并继续执行多个事务,日志读取器代理程序将扫描多个事务日志中的分发数据库的同时,扫描500交易默认。如果百万、数百万的数据被多次执行,他们将被封锁了很长一段时间。

日志读取器代理可以被配置为将大型事务划分为多个小事务,以传递给分发数据库,并根据小事务将分发队列分发到订阅数据库,以便数据将很快同步。

在代理参数更改之前,我已经插入了30万的数据,将1个数据执行到发布表中:



如您所见,1个事务的命令必须在一次分发出去分发,分配需要时间,而且等待时间太长,无法影响事务的实时性。

如果有其他交易,默认500(参考参数:- readbatchsize)也将一起度过了很长一段时间。

现在参数被改变了,扫描到大约1000的命令立即被分配,并且需要以下参数:

MaxCmdsInTran number_of_commands



注意:此参数只能添加到日志读取器代理中,代理配置文件不具有此参数。

添加后,重新启动日志读取器代理程序。

再次插入30万的数据!监视视图





如您所见,命令分布在1000左右。此时,查看订阅数据库,并同步数据,从而节省更多扫描命令的时间。

请更详细地查看每个事务的命令数,如下所示:


选择前10 a.xact_seqno,a.entry_time,计数(*)作为指挥
从distribution.dbo.msrepl_transactions一(NOLOCK)
内部联接distribution.dbo.msrepl_commands B(NOLOCK)
在a.xact_seqno = b.xact_seqno
集团通过a.xact_seqno,a.entry_time
通过CMDS倒序




尽管这个参数很好,但它也可能导致数据一致性。

如:

在出版物中更新了一批数据,但在订阅查询时它是不同的。

分布事务遇到冲突或死锁,这也会导致该部分的数据不一致。

参考:复制日志读取器代理