处理表更新的最佳方法

时间:2017-04-21 08:04:00

标签: sql-server ssis

我正在寻找使用SSIS更新表的更好方法。具体来说,我想优化表上的更新(大约10个表使用相同的逻辑)。

逻辑是,

  1. 从分段中选择源数据然后插入DW中的物理临时表(即TMP_Tbl)
  2. 将所有与customerId列匹配的数据从TMP_Tbl更新为MyTbl。
  3. 将所有不存在的customerId列从TMP_Tbl1插入MyTbl。
  4. 使用上述步骤,这需要一些时间来填充TMP_Tbl。因此,我计划将逻辑更改为delete-insert但是根据这个: In SQL, is UPDATE always faster than DELETE+INSERT?这将是痛苦的一个方法。

    假设:

    • 表格中没有使用索引/键
    • 有些表包含5M行,有些包含2k行
    • 每个表格更新需要2-3分钟,大约需要15到20分钟
    • 这些更新我们在单独的序列容器中同时运行

    任何人都知道什么是最好的使用方式,似乎需要删除物理临时表,这是正常的吗?

1 个答案:

答案 0 :(得分:0)

使用SSIS,您通常BULK INSERT,而不是INSERT。因此,如果您不介意DELETE - 重新插入行应该总体上优于UPDATE

考虑到这一点,更快的方法是:

  1. [Execute SQL Task]删除您需要更新的所有记录。 (根据您的数据库设计和查询,某些索引可能会有帮助)。

  2. [Data Flow Task]快速加载(使用OLE DB目标,数据访问模式:fiew表 - 快速加载)更新和从源到MyTbl的新记录。这里不需要临时表。

  3. 如果您不想/不想DELETE条记录 - 您当前的方法也可以。 您只需要修复UPDATE查询的性能(添加索引应该有帮助)。每更新一次记录2-3分钟太长了。 如果更新数百万条记录的时间是2-3分钟 - 那么它是可以接受的。

    将正确的非聚集索引添加到表中不应该导致更新时间更多"。 会有轻微的开销,但如果它有助于你UPDATE寻找而不是扫描大桌子 - 通常是值得的。