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 SSIS包瓶颈插入记录_Sql Server_Ssis - Fatal编程技术网

Sql server SSIS包瓶颈插入记录

Sql server SSIS包瓶颈插入记录,sql-server,ssis,Sql Server,Ssis,我正在创建一个SSIS包,它使用查找功能将数据从源系统加载到数据仓库中。 以下是流程当前的设置方式: 将所有相关表加载到临时表(6个查找表和事实表的数据) 对于每个查找表,使用查找组件确定数据仓库维度表中是否已存在记录。如果匹配,则从维度获取ID;如果不匹配,则派生匹配 将维度的ID和从源流经的其他两三条数据加载到事实表中 不太复杂。查找表有10到50条记录。我已将我的源数据限制为10000条记录,以便包在合理的时间内完成。 加载10000条记录需要20分钟 消息中的时间线显示: 11:13:

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

  • 将所有相关表加载到临时表(6个查找表和事实表的数据)
  • 对于每个查找表,使用查找组件确定数据仓库维度表中是否已存在记录。如果匹配,则从维度获取ID;如果不匹配,则派生匹配
  • 将维度的ID和从源流经的其他两三条数据加载到事实表中
  • 不太复杂。查找表有10到50条记录。我已将我的源数据限制为10000条记录,以便包在合理的时间内完成。 加载10000条记录需要20分钟

    消息中的时间线显示:

    • 11:13:28-包已启动
    • 11:13:36-所有查找都已准备就绪
    • 11:32:33-在“目标-事实插入新记录”中插入数据的最终提交已结束
    • 11:32:34-套餐结束
    我在哪里可以看到为什么插入10000条记录花费了将近19分钟?有什么建议我可以做不同的,使这运行更快

    编辑:对以下问题的回答

    数据类型-不确定您在问什么?我正在查找的数据类型是什么?整数是ID字段。代码字段为整数或字符(4)

    主要流程的数据流是:源(运行查询以从阶段表中获取信息)、查找LocationID、匹配和不匹配到Union、查找伤害代码ID、匹配和不匹配到Union、对接下来的4个查找表重复、对源进行排序、合并join my target(当前为空表)、确定添加、更改或删除记录(这些都是补充)

    目标表是:

    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


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

    我从SSIS包中删除了所有查找函数。在我的源代码中,我使用了使用左外部联接的单个查询,以便在适当的字段中获得FK_ID或NULL。我在查询中对源代码和目标代码进行了排序,然后使用了合并JOIN以标识包是否应添加/更新/删除


    一旦部署到服务器上,10000条记录的插入时间从19分多钟变为17秒。我能够在10分钟内加载650K条记录的整个表。

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