SSIS包瓶颈插入记录

Posted

技术标签:

【中文标题】SSIS包瓶颈插入记录【英文标题】:SSIS package bottleneck inserting records 【发布时间】:2014-11-03 17:05:29 【问题描述】:

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

    将所有相关表加载到临时表(6 个查找表和事实表的数据) 对于每个查找表,使用查找组件来确定数据仓库维度表中是否已存在记录。如果匹配则从维度获取 ID,如果不匹配则派生匹配项。 将维度的 ID 以及从源流过的两三个其他数据加载到事实表中。

不是很复杂。查找表有 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)。

主要流程的数据流是:Source(运行查询从stage表中获取信息),查找LocationID,匹配和不匹配到Union,查找Injury CodeID,匹配和不匹配到Union,重复接下来的4个查找表,对源进行排序,合并加入我的目标(目前是一个空表),确定Add、Change或Delete记录(这些都是Adds)。

目标表是:

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

我会尝试用派生列重新做包,看看执行需要多长时间。

【问题讨论】:

您的数据类型是什么?您的数据流是什么样的?目标表上是否有触发器?目标表的定义是什么?如果将目标替换为派生列并运行包,that 需要多长时间?您是否收集了从命令行/SQL 代理运行的这些计时,还是在 Visual Studio/BIDS/SSDT 的上下文中执行的?您使用的是什么版本的 SSIS? 你用什么来查明记录是否被创建/更新/删除?从您的帖子来看,这部分似乎在 19 分钟的窗口内,并且这种类型的操作在 SSIS 中是出了名的慢。此外,插入的组件是什么以及它是如何配置的?最后,您是否在插入之前关闭索引并稍后重建它们? (另一个“已知”减速带) 如果我在“插入”期间查询 tfResidentEvent,直到包完成后才会返回任何记录。我正在使用 ODE DB Destination 使用 Table 或 View - fast load 选项进行插入。目前除了PK之外,表上没有索引。 【参考方案1】:

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

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

【讨论】:

以上是关于SSIS包瓶颈插入记录的主要内容,如果未能解决你的问题,请参考以下文章

SSIS“数据流任务”平面文件目标中没有记录

为啥我的触发器在 SSIS 插入期间没有触发?

从同一个包更新和插入到 2 个不同的表

SSIS - OLE DB 目标 - 表或视图加载与快速加载

ssis 项目部署模型

SSIS: 一步步教你在SSIS 中使用临时表