【问题标题】:What is the most efficient way to move data from one sql table to another将数据从一个 sql 表移动到另一个表的最有效方法是什么
【发布时间】:2017-09-22 15:58:23
【问题描述】:

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

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

目前情况如下:

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

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

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

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

我将不胜感激。

【问题讨论】:

  • 这 2M 条记录中有多少根本没有改变?换句话说,有多少记录是新的,有多少是更新的?您可以将LastUpdated datetimeVerCol rowversion 添加到源表吗?
  • 很难说。进来的大部分数据绝对是新的。但数据来自票务系统,并且随时可能发生变化。

标签: sql-server-2008 ssis data-synchronization large-data


【解决方案1】:

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

【讨论】:

  • +1 这是一个有趣的想法。我喜欢。我特别喜欢不必返回并更新任何存储过程。我一定会调查的。
【解决方案2】:

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

Here's a summary

This is more on point with your question

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      How to improve performance of SQL MERGE statement

      【讨论】:

        猜你喜欢
        • 2012-02-29
        • 2015-06-20
        • 1970-01-01
        • 2023-03-10
        • 2011-11-28
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多