SQL Server在大型表

时间:2015-06-16 01:53:12

标签: sql-server sql-server-2008-r2 batch-processing

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

  

Microsoft SQL Server \ 100 \ COM \ Tablediff.exe

这是SQL Server 2008 R2。它从一个实例连接到另一个相同的实例。它运作得很好!

我的情况是,现在有10767594条记录的表需要2.5小时才能完成,它在作业中只有一个表。我怎样才能改善这个?

该进程由Windows Scheduled Task触发,这会调用.bat文件,.bat文件包含推荐的代码,该代码没有问题。我们有几个这样的已经有一段时间了。这只是处理从实例到实例的大表的一项工作,花费的时间太长。

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

表差异对索引运行得更好吗?

有没有办法更有效地使用表格差异?

E.g。如果我捕获lastProcessedID,我可以在下次为所有记录where id > lastProcessedID运行tableDiff吗?

任何建议都会很棒。提前谢谢

编辑:

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

我接受了以下答案,因为它非常有帮助。我确实按照合并复制路径进行了设置,但是在设置复制和发布后,我发现生产实例无法成为订阅者,因为安装时不会复制复制。正如Jason所说,它的研究,学习和设置都是合理的。因为我不是一名DBA,并且在此之前没有看过这个经验。

1 个答案:

答案 0 :(得分:2)

性能问题是因为远程查询从每个地方拉取每条记录进行比较以生成输出。索引可以略微帮助从每个位置拉动一点点,但它不太可能是重要的。

增量方法肯定更好。我不相信tablediff直接支持比较2个查询。如果是这样,你可以做一些像EXCEPT或INTERSECT这样的比较。如果您试图保持这些数据库同步,为什么不考虑其他解决方案,如日志传送,镜像,SSIS,复制,群集等。