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包瓶颈插入记录的主要内容,如果未能解决你的问题,请参考以下文章