SSIS包装瓶颈插入记录

时间:2014-11-03 17:05:29

标签: sql-server ssis

我正在创建一个SSIS包,使用查找将数据从源系统加载到数据仓库中。 以下是当前设置过程的方式:

  1. 将所有相关表加载到登台表(6个查找表和事实表的数据)
  2. 对于每个查找表,使用Lookup组件确定记录是否已存在于数据仓库维度表中。如果匹配则从维度获取ID,如果不匹配则获得匹配。
  3. 将维度的ID和来自源的两三个其他数据加载到事实表中。
  4. 不是很复杂。查找表有10到50条记录。我将源数据限制为10,000条记录,以便在合理的时间内完成包。 加载10,000条记录需要20分钟。

    消息中的时间线显示:

    • 11:13:28 - 套餐已开始
    • 11:13:36 - 所有查找都已准备就绪
    • 11:32:33 - “目标 - 事实插入新记录已结束”中数据插入的最终提交
    • 11:32:34 - 已结束

    我在哪里可以看到为什么插入10,000条记录需要花费近19分钟?关于我可以采取哪些不同的做法以使其运行更快的任何建议?

    编辑:回答以下问题

    数据类型 - 不确定你在问什么?我正在查找的数据类型?整数是ID字段。 Code字段是整数或Char(4)。

    主要进程的数据流是:源(运行查询以从阶段表获取信息),查找LocationID,匹配和不匹配到Union,查找伤害CodeID,匹配和不匹配到Union,重复下4个查找表,排序源,合并加入我的目标(当前是一个空表),确定添加,更改或删除记录(这些都是添加)。

    目标表是:

    CREATE TABLE dbo.tfResidentEvent
        (
          ResidentEventID INT IDENTITY(1, 1)
                               PRIMARY KEY ,
          SourceSystemID INT ,
          EventID INTEGER ,
          EventCodeID INT ,
          FacilityID INT  ,
          ResidentID INT  ,
          DateID INT  ,
          TimeID INT  ,
          LocationCodeID INT  ,
          CauseCodeID INT  ,
          ConditionCodeID INT ,
          InjuryCodeID INT ,
          chksum_type1 int,
          chksum_type2 int
        )
    

    时间来自服务器上显示的用于执行程序包的消息。

    SQL Server 2012上的SSIS

    我将尝试使用派生列重新执行包,并查看执行所需的时间。

1 个答案:

答案 0 :(得分:0)

我从SSIS包中删除了所有LOOKUP函数。在我的源代码中,我使用了LEFT OUTER JOINS的单个查询,以便在适当的字段中获取FK_ID或NULL。我在查询中对源和目标进行了排序,然后使用MERGE JOIN来识别包是否应该添加/更新/删除。

在服务器上部署后,10,000条记录的插入时间从19分钟到17秒不等。我能够在10分钟内加载整个650K记录表。