Sql server SQL Server在大型表上使用TableDiff

Sql server SQL Server在大型表上使用TableDiff,sql-server,sql-server-2008-r2,batch-processing,Sql Server,Sql Server 2008 R2,Batch Processing,我们有一个使用SQL Server惊人的tableDiff的流程,通过: Microsoft SQL Server\100\COM\Tablediff.exe 这是SQLServer2008R2。它从一个实例连接到另一个相同的实例。它工作得很好 我有一种情况,一个表现在有10767594条记录,需要2.5个小时才能完成,它在作业中只有一个表。我该如何改进这一点 该进程由Windows计划任务触发,这将调用.bat文件,.bat文件包含没有问题的建议代码。我们有两个这样的地方,已经有一段时间了。这

我们有一个使用SQL Server惊人的tableDiff的流程,通过:

Microsoft SQL Server\100\COM\Tablediff.exe

这是SQLServer2008R2。它从一个实例连接到另一个相同的实例。它工作得很好

我有一种情况,一个表现在有10767594条记录,需要2.5个小时才能完成,它在作业中只有一个表。我该如何改进这一点

该进程由Windows计划任务触发,这将调用
.bat
文件,
.bat
文件包含没有问题的建议代码。我们有两个这样的地方,已经有一段时间了。这只是一项处理一个实例到另一个实例的大表的工作,这项工作耗时太长

我意识到源表确实有索引,但目标表没有。我会在这张表上放一个索引,我还能做什么

使用索引时,表diff运行得更好吗

有没有更有效地使用表diff的方法

例如,如果我捕获了
lastprocessedd
,我下次是否可以为所有记录运行tableDiff
where id>lastprocessedd

任何建议都很好。先谢谢你

编辑:

我的解决方案——这是一个非常非常大的惊喜。正如我前面提到的,1000多万条记录表在源和目标上是相同的,除了两个索引(在源上)。因为这是一个内部生产服务器,所以在等待了几个小时之后,我将索引应用于源。现在我运行tableDiff作业,该作业根本没有更改,它在2分钟内完成。2.5小时到2分钟


我接受了下面的答案,因为它非常有用。我确实选择了合并复制路径,但是在设置复制和发布之后,我发现生产实例无法成为订阅服务器,因为在安装时没有勾选复制。正如Jason所说,这是一个合理的研究、学习和设置量。因为我不是DBA,以前也没有看过这方面的内容,所以这是一个值得一试的经验。

性能问题是因为远程查询从每个位置提取每个记录,进行比较以生成输出。索引可以稍微有助于加快从每个位置的拉动速度,但这不太可能是显著的


增量方法肯定更好。我不认为tablediff直接支持比较两个查询。如果有,您可以执行类似于“除”或“相交”的操作来进行比较。如果您试图保持这些数据库同步,为什么不考虑其他解决方案,如日志传送、镜像、SSIS、复制、集群等。

谢谢您的评论。有些表在一个实例中是主表,所以数据是单向的,有些表在另一个实例中是主表,所以数据是反向的。tableDiff已经很好地工作了这么长时间。这只是一个大桌子的工作,这成了一个问题,因为我想每小时运行一次。我找不到太多关于tableDiff限制的信息。它甚至都不是一个标签。鉴于此,您将使用什么方法?如果您只有几个表要同步,我将研究复制。我提到的大多数其他东西都是数据库级的,甚至是服务器级的。复制允许您同步特定的表。设置起来可能有点繁琐,但只需要几个表,就可以有效地满足您的场景。我可能会做合并复制。再次感谢Jason,你的建议很好。我编辑了我的OP,以解释您的建议是多么有用,并且将索引应用到目的地实际上产生了巨大的差异,足以解决问题。我想tableDiff可能不是一个很好的长期解决方案。我需要实现某种增量差异复制,因为该表将继续增长。您认为tableDiff应该在什么时候不再使用。一个时间因素,记录的数量?我很高兴这对你有用!老实说,我没有办法说什么是截止时间——这真的取决于你的硬件和其他关于我何时采取行动的查询。随着请求量的增加,您可能会开始看到阻塞甚至锁定升级,这将随着时间的推移开始减慢速度。由于复制在配置时不是一个选项,如果您注意到开始计时到您感到不舒服的时间点,请查看创建一个简单的SSIS包,在该包中您可以在查询中使用已处理的日期。这对你来说可能是一个很好的下一步。