Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 处理表上更新的最佳方法_Sql Server_Ssis - Fatal编程技术网

Sql server 处理表上更新的最佳方法

Sql server 处理表上更新的最佳方法,sql-server,ssis,Sql Server,Ssis,我正在寻找使用SSI更新表的更好方法。具体来说,我想优化表上的更新(大约有10个表使用相同的逻辑) 逻辑是, 从暂存中选择源数据,然后将其插入DW中的物理临时表(即TMP_Tbl) 从TMP_Tbl到MyTbl更新customerId列的所有数据匹配 将所有不存在的customerId列从TMP_Tbl1插入MyTbl 使用上述步骤,填充TMP_Tbl需要一些时间。因此,我计划将逻辑更改为删除insert,但根据以下内容: 这将是一个痛苦的处方 鉴于: 表上未使用索引/键 有些表包含5百万行,

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

逻辑是,

  • 从暂存中选择源数据,然后将其插入DW中的物理临时表(即TMP_Tbl)
  • 从TMP_Tbl到MyTbl更新customerId列的所有数据匹配
  • 将所有不存在的customerId列从TMP_Tbl1插入MyTbl
  • 使用上述步骤,填充TMP_Tbl需要一些时间。因此,我计划将逻辑更改为删除insert,但根据以下内容: 这将是一个痛苦的处方

    鉴于:

    • 表上未使用索引/键
    • 有些表包含5百万行,有些表包含2千行
    • 每次表更新需要2-3分钟,总共需要大约(15到20分钟)
    • 这些更新我们在单独的序列容器中同时运行

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

    对于SSI,您通常是
    批量插入
    ,而不是
    插入
    。因此,如果您不介意
    DELETE
    ,那么重新插入行通常应该比
    UPDATE
    更好

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

  • [执行SQL任务]
    删除所有需要更新的记录。(根据您的数据库设计和查询,此处某些索引可能会有所帮助)

  • [数据流任务]
    快速加载(使用OLE DB目的地,数据访问模式:fiew表-快速加载)将更新记录和新记录从源文件加载到MyTbl。这里不需要临时表格

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

    向表中添加正确的非聚集索引不应导致“更多的更新时间”。
    这会有一点开销,但如果它能帮助您的
    更新
    查找而不是扫描一个大表,那么这通常是值得的。

    可以通过创建一些索引来提高性能。如果没有,15分钟听起来也不算太糟糕,因为你要面对数百万排的队伍。SSIS是用来做插入、更新的,所以你不应该真的考虑删除/插入,除非你有一个特别的理由这样做。如果我错了,请纠正我。我认为如果我在表中添加一个非聚集索引,更新将花费更多的时间。