如何在SSIS中有效地加载和过滤数据

时间:2017-12-09 05:33:31

标签: sql-server performance ssis etl

需要加载一个平面文件,其中包含在SQL Server 2016中的预定作业中执行的SSIS包,但它需要花费太多时间(例如2/3小时)才能在源代码中加载数据然后需要额外的( 2/3小时)排序和过滤的时间然后需要类似的时间来加载目标中的数据,该文件只有几百万行,并且它的文件大约不小于3 GB。这让我发疯,因为这会影响我服务器的性能。

SSIS包: - 我的包只是一个数据流任务,它有一个平面文件源和一个OLE DB目的地,全部 - 数据访问模式设置为FAST LOAD。 - 表中只有1个索引。我的目标表有32列

输入文件: 输入文本文件有超过32列,代理键数据可能不唯一,引用列日期可能不唯一,需要过滤它们。

面对两个问题一个是SSIS FlatFile-Source花费大量时间加载日期另一个是排序和过滤。怎么办?

enter image description here

2 个答案:

答案 0 :(得分:1)

如果您希望它快速运行,请使用此模式:

  1. 将数据完全按原样加载到临时表中
  2. 可选择将索引添加到临时表中
  3. 使用SQL执行您需要的任何处理(即SELECT DISTINCT,GROUP BY进入最终表格)
  4. 您可以在SSIS中执行此类操作,但需要对其进行正确调整等等。在已经针对此进行了优化的数据库中,这样做更容易

答案 1 :(得分:0)

一些建议

<强> 1。 DROP并重新创建索引

添加2 Execute SQL Task;在Data Flow Task之前和之后,第一次删除索引,第二次重新创建,Data Flow Task成功执行后

<强> 2。调整缓冲区大小

您可以在以下Technet article

中详细了解缓冲区大小调整

第3。删除SQL Server中的重复项而不是排序组件

尝试删除排序组件,并在运行类似查询的Execute SQL Task之后添加Data Flow Task

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
DELETE x WHERE rn > 1;

<强> 4。使用脚本组件而不是排序

您必须对以下答案实施类似的逻辑:

一些有用的链接