目前我有一个SSIS作业,用于将数据从一台sql 20008机器移动到另一台机器。这项工作从大约6个表中移动了大约200万条记录。这需要大约5-10分钟,具体取决于服务器负载,这很好。因为数据被移动到临时表中,所以除了服务器上的压力之外什么都不会受到影响。
但是当我现在想要将这些数据与他们各自的实时表合并时,我的问题就变成了。这可能需要大约15分钟,在此期间表被清空然后重新填充。我想知道的是在表之间移动数据的最有效方法是什么。
目前的情况如下:
删除表
使用索引和约束重建表
插入选择移动数据
然后运行所需的任何计算
运行以下命令以在移动数据后重建所有索引:
sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?')"
我觉得应该有更好的方法,以便最大限度地缩短用户的停机时间。我有一个想法是创建第二组表,然后只要它们准备就重命名,但我不确定这是否也是最好的方法。
我还刚刚阅读了关于merge命令的内容,这可能会更好,因为我不必删除表并重新填充,这意味着所有数据都将保持可用但很难知道记录是否在不看所有栏目。
我将不胜感激。
答案 0 :(得分:3)
如果要清空并重新填充我们经常执行的操作,请创建一个与当前表同名的视图(因此不存在现有代码),并创建两个名为tablenameA和tablenameB的表,它们具有相同的结构和所有数据。将视图指向tablenameA。截断TableNameB。删除索引。运行该进程以填充tablenameB和reindex,运行脚本将视图指向tablenameB。停机时间给用户?毫秒。然后,下次切换并截断并填充TableNameA,然后将视图重做为TableNameA。
答案 1 :(得分:2)
看一下表分区。我相信你的用例是表分区存在的原因之一。
This is more on point with your question
我应该提一下,此功能仅适用于Enterprise和Developer SKU
答案 2 :(得分:0)
除了上面关于表分区的观点之外,您还可以避免到临时表的步骤。使用在目标服务器上运行程序包的SQL Server目标加载到空分区。使用分区索引并仅为该空分区重建索引。合并到新分区。
答案 3 :(得分:0)
在考虑了具有不同基础表的视图的选项之后,我决定避免它可能引入的复杂性和混乱。我查看了分区,但由于我对源计算机没有太多控制权,因此它似乎不是合适的解决方案。所以最后我决定使用SQL MERGE语句并使用BINARY_CHECKSUM来比较行并确定是否存在差异。虽然我没有遇到锁定的问题。但我已经为此提出了另一个问题。