0

目前我有一个 SSIS 作业,用于将数据从一台 sql 20008 机器移动到另一台机器。该作业从大约 6 个表中移动了大约 200 万条记录。这大约需要 5-10 分钟,具体取决于服务器负载,这很好。因为数据被移动到临时表中,所以除了服务器的压力之外没有任何影响。

但是当我现在想将该数据与其各自的实时表合并时,我的问题就变成了。这可能需要大约 15 分钟,在此期间表被清空然后重新填充。我想知道的是在表之间移动数据的最有效方法是什么。

目前情况如下:

删除表
重建带有索引和约束的表
插入选择以移动数据
然后运行所需的任何计算
运行以下命令以在移动数据后重建所有索引:

sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?')"

我觉得应该有更好的方法,以便用户的停机时间最短。我的一个想法是创建第二组表,然后在它们准备好后重命名它们,但我不确定这是否是最好的方法。

我也刚刚阅读了合并命令,这可能会更好,因为我不必删除表并重新填充,这意味着所有数据都将保持可用,但如果不查看几乎所有列就很难知道记录是否发生变化.

我将不胜感激任何帮助。

4

4 回答 4

3

如果您要清空并重新填充我们经常做的事情是创建一个与当前表同名的视图(因此没有现有的代码中断)并创建两个名为 tablenameA 和 tablenameB 的表具有相同的结构和所有数据。将视图指向 tablenameA。截断表名 B。删除索引。运行填充 tablenameB 并重新索引的过程,运行脚本将视图指向 tablenameB。停机时间给用户?毫秒。然后下次切换并截断并填充 TableNameA,然后将视图重做为 TableNameA。

于 2011-03-10T19:18:03.723 回答
2

看看表分区。我相信您的用例是表分区存在的原因之一。

这是一个摘要

这更符合您的问题

我应该提一下,此功能仅适用于企业和开发人员 SKU

于 2011-03-10T19:36:15.933 回答
0

除了上述关于表分区的点之外,您还可以避免进入临时表的步骤。使用在目标服务器上运行包的 SQL Server 目标加载到空分区。使用分区索引并仅为该空分区重建索引。合并到新分区中。

于 2011-03-15T13:23:11.557 回答
0

在考虑了具有不同基础表的视图选项后,我决定避免它可能引入的复杂性和混乱。我研究了分区,但由于我对源机器没有太多控制权,它似乎不是合适的解决方案。所以最后我决定使用 SQL MERGE 语句并使用 BINARY_CHECKSUM 来比较行并确定差异与否。尽管我对此没有锁定问题。但我为此提出了另一个问题。

如何提高 SQL MERGE 语句的性能

于 2011-04-14T18:09:05.443 回答